考虑以下java String:
String input = "a, b, (c, d), e, f, (g, (h, i))";
你能帮我找一个java regexp来获得它的6个部分:
a
b
(c,d)
e
f
(g, (h,i))
这是从基于“最外部”逗号的原始输入字符串中获得的。
答案 0 :(得分:3)
不要尝试将regex用于此类任务,因为Java中的regex不支持递归。最简单的解决方案是编写自己的解析器,它将计算(
和)
的余额(我们称之为括号嵌套级别),如果嵌套级别为{{1,则仅在,
上拆分}}。
此任务的简单代码(也将在一次迭代中解决此问题)看起来像
0
用法:
public static List<String> splitOnNotNestedCommas(String data){
List<String> resultList = new ArrayList();
StringBuilder sb = new StringBuilder();
int nestingLvl = 0;
for (char ch : data.toCharArray()){
if (ch == '(') nestingLvl++;
if (ch == ')') nestingLvl--;
if (ch == ',' & nestingLvl==0){
resultList.add(sb.toString().trim());
sb.delete(0, sb.length());
}else{
sb.append(ch);
}
}
if (sb.length()>0)
resultList.add(sb.toString().trim());
return resultList;
}
输出:
for (String s : splitOnNotNestedCommas("a, b, (c, d), e, f, (g, (h, i))")){
System.out.println(s);
}