基于Parens将字符串拆分为较小的部分

mai*_*rgs 1 java language-agnostic string algorithm

使用java我正在尝试使用递归来开发一个方法来分析表单的String:

(PART0(PART1(PART2)(PART3)))
Run Code Online (Sandbox Code Playgroud)

我希望该方法拆分相关的字符串.我希望这个方法能够让我能够在字符串的每个部分上执行一些逻辑,而不依赖于这个顺序的括号:

PART2
PART3
PART1
PART0
Run Code Online (Sandbox Code Playgroud)

这是我的方法目前的样子:

private void check(String stmt) throws Exception {

    System.out.println(stmt);
    int firstIndex = 0;
    int lastIndex = 0;
    while(firstIndex !=-1){
        firstIndex = stmt.indexOf('(');
        lastIndex = stmt.lastIndexOf(')');

        check(stmt.substring(firstIndex+1,lastIndex));

     }
}
Run Code Online (Sandbox Code Playgroud)

这是我的输出到目前为止:

(PART0(PART1(PART2)(PART3)))
PART0(PART1(PART2)(PART3))
PART1(PART2)(PART3)
PART2)(PART3
Run Code Online (Sandbox Code Playgroud)

基本上它在这部分分解:PART1(PART2)(PART3)

有没有更优雅的方式来做到这一点?

Ste*_* B. 11

嵌套上下文最自然地作为堆栈工作.

- 每次你开始一个新的上下文(遇到'(')push()

- 每次退出上下文(遇到')')pop()

- 每个pop()将对应完整的上下文

即:

public static void main(String args[])
    {
         String s   = "(PART0(PART1(PART2)(PART3)))";
        Stack<StringBuilder> stack = new Stack<StringBuilder>();
        StringBuilder curr = null;
        for (int i = 0; i < s.length(); i++)
        {
            char c = s.charAt(i);
            if (c == '(')
            {
                curr = new StringBuilder();
                stack.push(curr);
            }
            else if (c == ')')
            {
                System.out.println(stack.pop());
            }
            else
            {
                curr.append(c);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

你可能也想添加一些错误检查,即如果没有上下文推送或弹出,那么你就会得到不匹配的parens(格式错误的字符串).