“如何拆分此项”;“树状”;Java正则表达式中的字符串?

“如何拆分此项”;“树状”;Java正则表达式中的字符串?,java,regex,tree,split,Java,Regex,Tree,Split,这是字符串: 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是数组中的元素 如何拆分字符串 我有一个小小的问题:但

这是字符串:

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是数组中的元素

如何拆分字符串


我有一个小小的问题:但它的答案对于这个问题来说还不够好。

正则表达式没有足够的能力来解析平衡/嵌套括号。这与解析标记语言(如HTML)的问题基本相同,在HTML中,一致的建议是使用特殊的解析器,而不是正则表达式

您应该将其解析为一棵树。总体而言:

  • 创建一个堆栈
  • 当您点击“(”时,将下一块推到堆栈上
  • 当你碰到一个“)”时,弹出堆栈
这需要几分钟来编写,并将检查您的输入是否格式正确

这几乎可以立即为您节省时间。试图为此管理正则表达式将变得越来越复杂,几乎不可避免地会崩溃

更新:如果您只关心一个级别,那么它可以更简单(未调试):

List subTreeList=new ArrayList();
字符串s=getMyString();
智力水平=0;
int lastOpenBracket=-1
对于(int i=0;i

即使我只按第一级拆分str,也不要在末尾使用挂括号或在级别==1处使用奇怪的字符。

我不想拆分内部的字符()@droidpiggy:是的,因为需要平衡括号。嗨,你介意共享工作代码吗?我尝试了上面的代码,它似乎没有相应地拆分。
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