如何按逗号正确分割带嵌套括号、引号的递归键值对字符串
解决方案
正则提取方案
你可以使用支持嵌套匹配的正则直接提取目标片段,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
相关产品推荐
相关产品推荐

