You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按逗号正确分割带嵌套括号、引号的递归键值对字符串

解决方案

正则提取方案

你可以使用支持嵌套匹配的正则直接提取目标片段,Java测试代码如下:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SplitNestedString {
    public static void main(String[] args) {
        String input = "var1=[[1,2,3], [1,2,3]], var2=true, var3=\"hello\", var4=(var1=[[1,2,3], [1,2,3]], var2=true, var3=\"hello\")";
        // 支持嵌套括号、引号的匹配正则
        String regex = "[a-zA-Z0-9]+=(?:\\[(?:[^\\[\\]]++|(?R))*]|\\((?:[^()]++|(?R))*\\)|\"[^\"]*\"|\\w+)";
        Matcher matcher = Pattern.compile(regex).matcher(input);
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

运行后直接输出你需要的四个分割结果。

遍历修复方案

如果需要更灵活的逻辑控制,可以使用修复后的遍历实现,解决了原代码未处理引号、分支逻辑错误的问题:

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class SplitNestedString {
    public static void main(String[] args) {
        String input = "var1=[[1,2,3], [1,2,3]], var2=true, var3=\"hello\", var4=(var1=[[1,2,3], [1,2,3]], var2=true, var3=\"hello\")";
        splitNestedStr(input).forEach(System.out::println);
    }

    public static List<String> splitNestedStr(String str) {
        List<String> result = new ArrayList<>();
        StringBuilder current = new StringBuilder();
        Stack<Character> stack = new Stack<>();
        boolean inQuotes = false;

        for (char c : str.toCharArray()) {
            if (c == '"') {
                inQuotes = !inQuotes;
                current.append(c);
                continue;
            }
            if (inQuotes) {
                current.append(c);
                continue;
            }
            if (c == '(' || c == '[') {
                stack.push(c);
                current.append(c);
            } else if (c == ')' || c == ']') {
                if (!stack.isEmpty() && ((c == ')' && stack.peek() == '(') || (c == ']' && stack.peek() == '['))) {
                    stack.pop();
                }
                current.append(c);
            } else if (c == ',' && stack.isEmpty()) {
                // 仅分割最外层逗号
                result.add(current.toString().trim());
                current.setLength(0);
            } else {
                current.append(c);
            }
        }
        // 追加最后一个片段
        if (!current.isEmpty()) {
            result.add(current.toString().trim());
        }
        return result;
    }
}

两种方案输出均为:

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

内容的提问来源于stack exchange,提问作者Seema Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:57:03