【问题标题】:Split a string in Java with nested braces using delimiter comma outside使用外部分隔符逗号在 Java 中使用嵌套大括号拆分字符串
【发布时间】:2019-11-08 06:20:10
【问题描述】:

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

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

输入字符串

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";

需要的输出

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

【问题讨论】:

  • 停在那里。您应该使用 JSON 解析器。
  • @TimBiegeleisen 除了输入不是 JSON。外层不是 JSON 数组(缺少 []),嵌套对象(第三个值)有双双引号。
  • 您不能使用正则表达式(因此split)来处理具有嵌套结构的文本。试试别的,例如自己迭代字符串的字符,跟踪 {} 嵌套以及是否在 "" 字符串内。
  • 如果没有任意嵌套:[^\s,}{][^,}{]*|\{(?:[^}{]+|\{(?:[^}{]+|\{[^}{]*\})*\})*\} 需要在模式中添加更深的最大嵌套。如果有任意嵌套,请参阅this idea。该模式可能看起来like this。但请注意,这是实验性的并且非常缓慢。它会在更大的字符串上中断:)

标签: java arrays regex split


【解决方案1】:

这不是正则表达式的设计目的。您需要创建一个解析器。

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

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);
        }
    }
}
  • 获取字符串并在, 上拆分,将分隔符保留为输出标记
  • 统计打开和关闭的次数{}。确保所有括号都已关闭。
  • 如果所有{ } 都已关闭,则移至下一行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2015-03-07
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多