如何在Java正则表达式中拆分这个“树状”字符串?
这是字符串:
String str = "(S(B1)(B2(B21)(B22)(B23))(B3)())";
子 – ()中的内容可以是“”,或者只是str的值,或者类似于该模式,递归地,因此子()是子树。
预期结果:
str1 is "(S(B1))" str2 is "(B2(B21)(B22)(B23))" //don't expand sons of a son str3 is "(B3)" str4 is "()"
str1-4是例如Array中的元素
如何拆分字符串?
我有一个熟悉的问题: 如何在Java正则表达式中拆分此字符串? 但它的答案对于这个来说还不够好。
正则表达式没有足够的力量来解析平衡/嵌套括号。 这与解析HTML等标记语言基本相同,其中一致的建议是使用特殊的解析器,而不是正则表达式。
您应该将其解析为树。 总体而言:
- 创建一个堆栈。
- 当你点击“(”将下一个块推入堆栈时。
- 当你点击“)”弹出堆栈。
这需要几分钟的时间来编写,并将检查您的输入是否格式正确。
这将几乎立即节省您的时间。 试图为此管理正则表达式将变得越来越复杂,几乎不可避免地会崩溃。
更新:如果你只关心一个级别,那么它可以更简单(未调试):
List subTreeList = new ArrayList (); 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的奇怪字符;