【问题标题】:How to separate recursive string by comma如何用逗号分隔递归字符串
【发布时间】:2021-11-10 09:23:33
【问题描述】:

我有这样的递归字符串,

var1=[[1,2,3], [1,2,3]], var2=true, var3="hello", var4=(var1=[[1,2,3], [1,2,3]], var2=true, var3="hello")

我想用逗号分隔字符串,想要的结果是这样,

  • var1=[[1,2,3], [1,2,3]]
  • var2=true
  • var3="你好"
  • var4=(var1=[[1,2,3], [1,2,3]], var2=true, var3="hello")

我试过这个正则表达式 (([a-zA-Z0-9]*)=(.*),?\s?)* 来匹配这样的东西 varx=(), 但完整的字符串是匹配的。

我也尝试通过遍历字符串来做到这一点,但无法分隔像 varx="...." 这样的字符串,因为引号可以包含任何内容,因此无法做到这一点.

    public static int fun2(int start_index, String str, int end_index) {
        Stack<Character> charStack = new Stack<>();
        charStack.add(str.charAt(start_index));
        char opp = ' ';
        if (str.charAt(start_index) == '(') {
            opp = ')';
        } else if (str.charAt(start_index) == '[') {
            opp = ']';
        } else if (str.charAt(start_index) == '[')
            while (end_index < str.length() && !charStack.isEmpty()) {
                if (str.charAt(end_index) == str.charAt(start_index)) {
                    charStack.add(str.charAt(start_index));
                } else if (str.charAt(end_index) == opp) {
                    charStack.pop();
                }
                end_index++;
            }
        if (charStack.isEmpty()) {
            System.out.println("correct");
            System.out.println(str.substring(start_index, end_index));
        }
        return end_index;
        // throw error
    }

    public static void fun(String str) {
        int start = 0;
        int end = -1;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '=') {
                System.out.println("key = " + str.substring(start, end + 1));
                start = i + 1;
                end = start + 1;
                if (str.charAt(start) == '[' || str.charAt(start) == '(' || str.charAt(i) == '"') {
                    System.out.println("value = ");
                    end = fun2(start, str, end);
                    start = end;
                    i = start;
                }
            } else if (str.charAt(i) == ',' || str.charAt(i) == ' ') {
                start++;
                end++;
            } else {
                end++;
            }
        }
    }

任何人都可以建议任何可以为我执行此操作的正则表达式或代码段。提前致谢。

【问题讨论】:

    标签: java regex regex-group


    【解决方案1】:

    要获得示例数据中的匹配项,您可以匹配关键部分而不匹配等号。

    对于值,您可以从左括号匹配到右括号,也可以匹配到下一个关键部分或字符串结尾。

    请注意,此模式不考虑括号或方括号的任何递归。这取决于匹配括号还是使用逗号作为分隔符。

    [^\s=,]+=(?:\([^()]*\)|.+?)(?=,\s*[^\s=,]+=|$)
    

    Regex demo

    在带有双反斜杠的 Java 中

    String regex = "[^\\s=,]+=(?:\\([^()]*\\)|.+?)(?=,\\s*[^\\s=,]+=|$)";
    

    【讨论】:

    • not working with this string v1=[[1,2,3], [2,3,4]], v3=(v1=[[1,2,3], [2,3,4]], v3=(), v4="123"), v4="123" 这里的输出是 v1=[[1,2,3], [2,3,4]] v3=(v1=[[1,2, 3], [2,3,4]] v3=() v4="123") v4="123"
    • @seemasharma 如果您不应该匹配空括号,您可以使用[^\s=,]+=(?:\([^()]*\)|.+?)(?=,\s*[^\s=,]+=(?!\(\))|$) 请参阅regex101.com/r/G6aVAM/1 但请注意,Java 正则表达式不支持递归。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2021-07-14
    • 2016-09-04
    相关资源
    最近更新 更多