【问题标题】:RegEx split array (string) with nested array带有嵌套数组的正则表达式拆分数组(字符串)
【发布时间】:2012-11-28 09:08:04
【问题描述】:

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

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

[1,'a b c',[1,'a b c',"A B C"],"A B C"]

或许

[1,['a b c'],'a',[1,"A B C"],"A B C"]

等等……

我希望结果中的顶部数组由逗号分隔,但嵌套数组包括逗号,但没有括号。

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

[0] -> 1

[1] -> 'abc'

[2] -> 1,'a b c',"A B C"

[3] -> “A B C”

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

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

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

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

非常感谢您的帮助!

马可

【问题讨论】:

  • 您使用的是什么语言?
  • 您要拆分的文本是什么?它看起来像 JSON。是什么创造了文本?如果它是一种众所周知的格式,而不是您刚刚编造的格式,那么可能有现有的代码可以为您进行解析。

标签: regex arrays split comma


【解决方案1】:

试试

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);
}

照你说的做

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

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

【讨论】:

    【解决方案2】:

    这个拆分正则表达式非常丑陋,但可以满足您的需求。从我使用 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 2017-10-19
      • 2017-01-04
      相关资源
      最近更新 更多