Regex 带有嵌套数组的正则表达式拆分数组(字符串)

Regex 带有嵌套数组的正则表达式拆分数组(字符串),regex,arrays,split,comma,Regex,Arrays,Split,Comma,我只是试图找到一些类似的东西来解决问题,但我只找到了一些“部分”,我不知道如何将它们结合起来。所以我希望任何人都能在这方面帮助我。问题是: 我有一个字符串,它包含一个带有一个(或多个)嵌套数组的数组 [1,'abc',[1,'abc',“abc”],“abc”] 或许 [1,['abc'],'a',[1,“abc”],“abc”] 等等 我想在结果中包含的是用逗号分隔的顶部数组,但嵌套数组中包含逗号,但没有括号 例如,对于第一个字符串: [0]->1 [1] ->“abc” [2] ->1、'a

我只是试图找到一些类似的东西来解决问题,但我只找到了一些“部分”,我不知道如何将它们结合起来。所以我希望任何人都能在这方面帮助我。问题是:

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

[1,'abc',[1,'abc',“abc”],“abc”]

或许

[1,['abc'],'a',[1,“abc”],“abc”]

等等

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

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

[0]->1

[1] ->“abc”

[2] ->1、'abc'、'abc'

[3] ->“A B C”

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

/\[[\w\d\s\,\'\“]+][\w\d\s\'\']+/g

但现在我不知道如何将正则表达式改为“剪切”内部括号。。。 我已经尝试过使用lookaheads/-behinds、单词边界、组等不同的方法,但没有成功。那么这可能吗?如果是,怎么做

也许我选择了错误的方法,但我需要说我对正则表达式是新手。 如果前者不太正确,请告诉我

非常感谢您的帮助

马可

试试看

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);
}
String[]parts=String.substring(1,String.length()-1)。拆分(“,”;
对于(int n=0;n
这和你说的一模一样

顶部数组用逗号分隔,但嵌套数组不带括号


有时,编程可能很简单:)

这个分割正则表达式非常难看,但它可以满足您的需要。从我使用RegexBuddy可以看出,它只能在.NET中工作

(?<=^\[(?:(?>\[[^\]\[]+(?:\]|(?=\])))|(?>[^\[\]]+))*|^)[,\[\]]+
(?\[\[^\]\[]+(?:\]|(?=\])))|(?>[^\[\]]+)*|^[,\[\]]+
虽然我很喜欢使用正则表达式,但在本例中,我认为我应该使用如下小函数(用C#编写):

string[]反序列化数组(string序列化数组){
const char OPEN_GROUP='[',CLOSE_GROUP=']',DELIMITER=',';
List deserializedArray=新列表();
StringBuilder累加器=新的StringBuilder();
int-nestDepth=0;
int baseDepth=darray[0]==OPEN_GROUP?1:0;

对于(int i=0;i)您正在使用的语言是什么?您正在拆分的文本是什么?它看起来类似于JSON。是什么创建了文本?如果它是一种众所周知的格式,而不是您刚刚编写的格式,则可能有现有的代码为您进行解析。
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();
}