查找方括号之间的字符串

本文关键字:字符串 之间 方括号 查找 | 更新日期: 2023-09-27 17:59:32

我有一个字符串,看起来像这样:

{
    "acl_gent": {
        "cluster": [],
        "indices": [{
            "names": ["am*"],
            "privileges": ["read", "view_index_metadata"],
            "query": "{'"match'": {'"ACL'": '"acl_gent'"}}"
        }],
        "run_as": []
    },
    "acl_luik": {
        "cluster": [],
        "indices": [{
            "names": ["am*"],
            "privileges": ["read", "view_index_metadata"],
            "query": "{'"match'": {'"ACL'": '"acl_luik'"}}"
        }],
        "run_as": []
    }
}

我想把它分成两个字符串,一个包含acl_gent,另一个包含acl_luik

上面的字符串可以包含2个以上的acl(我不知道名称)

所以我开始移除第一个和最后一个括号:

input = input.Substring(1, input.Length - 2);

但我不知道如何找到正确的右括号来提取数据。

这是我最接近的一次

private int closer(string input) {
    var i = input.IndexOf('}');
    Console.WriteLine(string.Format("[DEBUG] Checking: {0}", input.Substring(0, i).Contains('{')));
    if (input.Substring(0, i).Contains('{')) {
        return i + closer(input.Substring(i)) + 2;
    }
    return i;
}

查找方括号之间的字符串

您所拥有的是一个JSON字符串,一个来自web服务的常见响应,并且有很多库可以解析JSON,最常见的是JSON.NET

JObject myJsonObject = JObject.Parse(myResponse)

并通过它们的密钥名称(如)检索字符串

JObject aclString = myJsonObject["acl_luik"];

如果您想了解更多详细信息,在线有大量资源可用于解析JSON字符串。

这里有两个选项:

1) 解析为JSON并获得前2个对象,这是更好的一个。

2) 使用Stack作为令牌字符串进行分析,以获得您想要的内容,如下所示:-删除第一个和最后一个{}-使用堆栈,添加您找到的所有{,一旦找到},就删除堆栈中的第一个{。-一旦堆栈为空,那么您就可以在那里获得1个完整的对象,在工作时保存indeces,并且应该可以很容易地用start和end进行子字符串。

我最近遇到了同样的问题。我的解决方案是将字符串反序列化为json对象(在我的例子中是使用json.net的JObject),然后访问各个成员并将它们序列化为单独的字符串。

using Newtonsoft.Json.Linq;
public void MakeStrings(string json)
{
    var jobject = JsonConvert.DeserializeObject<JObject>(json);
    string acl_gent = JsonConvert.SerializeObject(jobject["acl_gent"]);
    string acl_luik = JsonConvert.SerializeObject(jobject["acl_luik"]);
}