在Java中使用外部分隔符逗号拆分带嵌套大括号的字符串

在Java中使用外部分隔符逗号拆分带嵌套大括号的字符串,java,arrays,regex,split,Java,Arrays,Regex,Split,试图在字符串中使用逗号作为分隔符进行拆分并添加到字符串数组中,但在使用正则表达式拆分字符串时遇到问题 String[] stringParts = str1.split(",(?![^\\[]*\\])"); for (int i=0; i<stringParts.length; i++){ stringParts[i] = stringParts[i].trim();//remove trailing leading spaces.

试图在字符串中使用逗号作为分隔符进行拆分并添加到字符串数组中,但在使用正则表达式拆分字符串时遇到问题

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
{""Customization"":{""EMPLOYEEID"":""EMPID001"",""MANAGER_ID"":""MNGID001"",""DEPARTMENT"":""IT""},""OTHERDETAILS"":{""GENDER"":""M"",""DESIGNATION"":""SENIOR"",""TEAM"":""QA""}}
8
nine
{{"COMPANYNAME":"XYZ Ind Pvt Ltd"},{[ten,{"11":"12"},{"thirteen":14}]}}
fifteen
16

这不是regex设计的目的。您需要创建一个解析器

或者你可以做类似的事情:

public static void main(String[] args) {
    String str = "1, two, {\"\"Customization\"\":{\"\"EMPLOYEEID\"\":\"\"EMPID001\"\",\"\"MANAGER_ID\"\":\"\"MNGID001\"\",\"\"DEPARTMENT\"\":\"\"IT\"\"},\"\"OTHERDETAILS\"\":{\"\"GENDER\"\":\"\"M\"\",\"\"DESIGNATION\"\":\"\"SENIOR\"\",\"\"TEAM\"\":\"\"QA\"\"}}, 8, nine,{{\"COMPANYNAME\":\"XYZ Ind Pvt Ltd\"},{[ten,{\"11\":\"12\"},{\"thirteen\":14}]}},\"fifteen\",16";
    StringTokenizer st = new StringTokenizer(str, ",", true);
    int bracketCount = 0;
    while (st.hasMoreTokens()) {
        String token = st.nextToken();
        long brackets = token.chars().map(ch -> (ch == '{' ? 1 : (ch == '}' ? -1 : 0))).sum();
        bracketCount += brackets;
        if (bracketCount == 0 && ",".equals(token)) {
            System.out.println("");
        } else {
            System.out.print(token);
        }
    }
}
  • 获取字符串并在
    上拆分,将分隔符保留为输出标记
  • 计算打开和关闭的次数
    {
    }
    。确保所有支架均已关闭
  • 如果所有
    {
    }都已关闭,则转到下一行

就停在那里。您应该使用JSON解析器。@TimBiegeleisen,但输入不是JSON。外层不是JSON数组(缺少
[]
),嵌套对象(第三个值)有双引号。不能使用正则表达式(因此
拆分
)处理嵌套结构的文本。尝试其他方法,例如,自己迭代字符串的字符,跟踪
{}
嵌套以及是否在
”“
字符串内。如果没有任意嵌套:需要向模式添加更深的最大嵌套。如果存在任意嵌套,请参见。这个图案看起来很像。但请注意,这是实验性的,而且速度非常缓慢。它将在较大的字符串上断开:)
public static void main(String[] args) {
    String str = "1, two, {\"\"Customization\"\":{\"\"EMPLOYEEID\"\":\"\"EMPID001\"\",\"\"MANAGER_ID\"\":\"\"MNGID001\"\",\"\"DEPARTMENT\"\":\"\"IT\"\"},\"\"OTHERDETAILS\"\":{\"\"GENDER\"\":\"\"M\"\",\"\"DESIGNATION\"\":\"\"SENIOR\"\",\"\"TEAM\"\":\"\"QA\"\"}}, 8, nine,{{\"COMPANYNAME\":\"XYZ Ind Pvt Ltd\"},{[ten,{\"11\":\"12\"},{\"thirteen\":14}]}},\"fifteen\",16";
    StringTokenizer st = new StringTokenizer(str, ",", true);
    int bracketCount = 0;
    while (st.hasMoreTokens()) {
        String token = st.nextToken();
        long brackets = token.chars().map(ch -> (ch == '{' ? 1 : (ch == '}' ? -1 : 0))).sum();
        bracketCount += brackets;
        if (bracketCount == 0 && ",".equals(token)) {
            System.out.println("");
        } else {
            System.out.print(token);
        }
    }
}