我在尝试使用嵌套分隔符拆分字符串时遇到了一些麻烦。
My String就像"(a,b(1,2,3),c,d(a,b,c))"
。
我怎样才能获得数组["a","b(1,2,3)","c","d(a,b,c)"]
?
我显然无法使用.split(",")
,因为它也会分割我的子字符串。
答案 0 :(得分:3)
这是一个直接的非递归函数,可以按照您想要的方式分割字符串:
private String[] specialSplit(String s) {
List<String> result = new ArrayList<>();
StringBuilder sb = new StringBuilder();
int parenCount = 0;
for (int i = 1; i < s.length() - 1; i++) { // go from 1 to length -1 to discard the surrounding ()
char c = s.charAt(i);
if (c == '(') parenCount++;
else if (c == ')') parenCount--;
if (parenCount == 0 && c == ',') {
result.add(sb.toString());
sb.setLength(0); // clear string builder
} else {
sb.append(c);
}
}
result.add(sb.toString());
return result.toArray(new String[0]);
}
基本上,我们遍历字符串的所有字符,跟踪括号。不考虑第一个和最后一个括号。当我们看到相同数量的开括号和右括号以及当前字符是&#39;时,我们只分割字符串。
此方法的运行速度可能比您可能找到的任何正则表达式快得多。
答案 1 :(得分:2)
递归函数应该在这里工作,而不是普通的split()
。尝试逐个字符地解析字符串,并在遇到逗号或paranthesis时执行操作:,
表示您创建一个新元素,(
您启动一个新的嵌套列表,)
表示您完成了当前嵌套列表。这甚至应该使用更“展开”的方法(即没有递归,但处理数据结构中的嵌套)。