这是字符串:
String str = "(S(B1)(B2(B21)(B22)(B23))(B3)())";
son-()中的内容可能是“”,或者只是str的值,或者像递归那样的模式,所以sub-()是子树。
预期结果:
str1 is "(S(B1))"
str2 is "(B2(B21)(B22)(B23))" //don't expand sons of a son
str3 is "(B3)"
str4 is "()"
str1-4例如数组中的元素
如何分割字符串?
我有一个熟悉的问题:How to split this string in Java regex?但它的答案对于这个问题还不够好。
答案 0 :(得分:1)
正则表达式没有足够的力量来解析平衡/嵌套括号。这与解析HTML等标记语言基本相同,其中一致的建议是使用特殊的解析器,而不是正则表达式。
您应该将其解析为树。总的来说:
这需要几分钟的时间来编写,并会检查您的输入是否格式正确。
这几乎可以立即节省您的时间。试图为此管理正则表达式将变得越来越复杂,几乎不可避免地会崩溃。
更新:如果您只关注一个级别,那么它可以更简单(未调试):
List<String> subTreeList = new ArrayList<String>();
String s = getMyString();
int level = 0;
int lastOpenBracket = -1
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(') {
level++;
if (level == 1) {
lastOpenBracket = i;
}
} else if (c == ')') {
if (level == 1) {
subStreeList.add(s.substring(lastOpenBracket, i);
}
level--;
}
}
I haven't checked it works, and you should debug it. You should also put checks to make sure you
末尾没有悬挂括号或级别为== 1的奇怪字符;