正则表达式以嵌套括号在Java中拆分字符串

问题描述 投票:0回答:2

我正在尝试拆分字符串并将其添加到字符串数组。

String str1 = "1, two, {[three,4,5,{six,7}]}, 8, nine,{[ten,{\"11\":\"12\"},{\"thirteen\":14}]},\"fifteen\",16";

数组中的必需输出是:

1
two
{[three,4,5,{six,7}]}
8
nine
{[ten,{"11":"12"},{"thirteen":14}]}
fifteen
16

我们需要使用正则表达式在Java中使用split函数将其拆分。任何人都可以建议正则表达式来获取此输出吗?

java arrays regex split nsregularexpression
2个回答
1
投票

如果文本不改变其结构,则可以为此专门编写正则表达式。我会做的事情:

  • 击败发送此输出的人
  • 说服他发送更好的方法,并用逗号和空格分隔每个逻辑部分
  • 现在,您可以使用正则表达式,\s分割字符串

0
投票

regex不是您需要的工具。

您可以尝试这样的事情:

public static String[] split(String s) {
    List<String> result = new ArrayList<>();
    StringBuilder buf = new StringBuilder();
    int level = 0;
    boolean inQuotes = false;
    for (char c: s.toCharArray()) {
        switch (c) {
            case ' ':
                if (buf.length() > 0) {
                    buf.append(c);
                }
                break;
            case ',':
                if (level == 0 && !inQuotes) {
                    result.add(buf.toString());
                    buf.setLength(0);
                } else {
                    buf.append(c);
                }
                break;
            case '"':
                buf.append(c);
                inQuotes = !inQuotes;
                break;
            case '[':
            case '{':
                buf.append(c);
                if (!inQuotes) {
                    ++level;
                }
                break;
            case ']':
            case '}':
                buf.append(c);
                if (!inQuotes) {
                    --level;
                }
                break;
            default:
                buf.append(c);
                break;
        }
    }
    if (inQuotes || level > 0) {
        throw new IllegalArgumentException("Syntax error");
    }
    result.add(buf.toString());
    return result.toArray(new String[result.size()]);
}

但是它不会消除引号(顺便说一句:我不知道应该如何处理引号):

1
two
{[three,4,5,{six,7}]}
8
nine
{[ten,{"11":"12"},{"thirteen":14}]}
"fifteen"
16
© www.soinside.com 2019 - 2024. All rights reserved.