1

我只是试图找到类似的东西来自己解决问题,但我只找到了一些“部分”,我不知道如何组合它们。所以我希望任何人都可以帮助我解决这个问题。问题:

我有一个字符串,其中包含一个带有一个(或多个)嵌套数组的数组。

[1,'ab c',[1,'ab c',"AB C"],"AB C"]

或者可能

[1,['ab c'],'a',[1,"AB C"],"AB C"]

ETC...

我想在结果中得到的是由逗号分隔的顶部数组,但嵌套数组包括逗号,但没有括号。

例如。对于第一个字符串:

[0] -> 1

[1]->'abc'

[2] -> 1,'ab c',"AB C"

[3]->“AB C”

我当前为我提供拆分顶部数组的正则表达式是:

/\[[\w\d\s\,\'\"]+]|[\w\d\s\"\']+/g

但是现在我不知道如何更改我的正则表达式来“剪切”内括号......我已经尝试了不同的方法,使用前瞻/后置、单词边界、组等,但没有任何成功。那么这甚至可能吗?如果是,如何?

也许我选择了错误的方法,但我需要说我是正则表达式的新手。因此,如果前者不完全正确,请原谅我。

非常感谢您的帮助!

马可

4

2 回答 2

0

尝试

String[] parts = string.substring(1,string.length()-1).split(",");
for (int n = 0; n < parts.length; n++) {
    if (parts.charAt(0) == '[') parts[n] = parts[n].substring(1,parts[n].length()-1);
}

从字面上看你所说的

顶部数组用逗号分隔,但嵌套数组没有括号。

有时,编程就是这么简单:)

于 2012-11-28T09:10:02.920 回答
0

这个拆分正则表达式非常丑陋,但可以满足您的要求。据我所知,使用 RegexBuddy,它只能在 .NET 中工作。

(?<=^\[(?:(?>\[[^\]\[]+(?:\]|(?=\])))|(?>[^\[\]]+))*|^)[,\[\]]+

尽管我喜欢使用正则表达式,但在这种情况下,我想我会使用如下的小函数(用 C# 编写):

string[] DeserializeArray(string serializedArray) {
    const char OPEN_GROUP = '[', CLOSE_GROUP = ']', DELIMITER = ',';
    List<string> deserializedArray = new List<string>();
    StringBuilder accumulator = new StringBuilder();
    int nestDepth = 0;
    int baseDepth = serializedArray[0] == OPEN_GROUP ? 1 : 0;
    for(int i=0; i<serializedArray.Length; ++i){
        if(serializedArray[i] == OPEN_GROUP) ++nestDepth;
        else if(serializedArray[i] == CLOSE_GROUP) --nestDepth;
        else if(serializedArray[i] == DELIMITER && nestDepth <= baseDepth) {
            deserializedArray.Add(accumulator.ToString());
            accumulator.Clear();
        }
        else {
            accumulator.Append(serializedArray[i]);
        }
    }
    deserializedArray.Add(accumulator.ToString());
    return deserializedArray.ToArray();
}
于 2012-12-02T13:43:32.873 回答