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

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

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

数组中的必需输出是:

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

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

mengzhuyt 回答:正则表达式使用嵌套括号在Java中拆分字符串

如果您的文本未更改其结构,则可以为此编写正则表达式。我要做的事情:

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

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
,

您可以使用以下正则表达式来完成它-> ,(?![^\\[]*\\])

检查下一个代码,它使用上面的正则表达式拆分String。然后迭代(字符串部分的)数组并修剪每个值,最后打印出数组。

public static void main(String[] args) {
        String str1 = "1,two,{[three,7}]},8,nine,{[ten,{\"11\":\"12\"},{\"thirteen\":14}]},\"fifteen\",16";
        String[] stringParts = str1.split(",(?![^\\[]*\\])");

        for (int i=0; i<stringParts.length; i++){
            stringParts[i] = stringParts[i].trim();//remove trailing leading spaces.
        }
        //System out
        for (String s:stringParts){
            System.out.println(s);
        }
    }

输出:

1
two
{[three,{"thirteen":14}]}
"fifteen"
16
本文链接:https://www.f2er.com/3147086.html

大家都在问