提问者:小点点

正则表达式匹配偶数方括号[重复]


我试图使正则表达式捕获括号中的表达式,但是当有多个括号部分时,正则表达式在第一次关闭时停止。一个例子会更好地解释它:

(expr)          #simple, it will catch "(expr)"

(expr1(expr2))  #there is bad cuz it catches "(expr1(expr2)"

我想要(expr1(expr2))

我目前正在使用此“\\(.*?\)”


共2个答案

匿名用户

您试图解决的问题通常不适合正则表达式,因为任意嵌套的内容不是正则文本。相反,您可能需要考虑编写某种解析器来查找嵌套术语。这里有一个建议脚本:

String input = "Hello (expr1(expr2)) Goodbye (Here is (another (deeply nested))) expression.";
int count = 0;
int start = 0;
int end;
for (int i=0; i < input.length(); ++i) {
    if (input.charAt(i) == '(') {
        ++count;
        if (count == 1) {
            start = i;
        }
    }
    if (input.charAt(i) == ')') {
        --count;
        if (count == 0) {
            System.out.println(input.substring(start, i+1));
        }
    }
}

这是通过跟踪左括号和右括号的数量来实现的。当我们看到一个且计数首先从零变为一时,我们记录发生该情况的字符串中的位置。在另一端,当我们看到一个且计数返回到零时,我们打印整个(可能是嵌套的)项。在更一般的情况下,您可以使用堆栈数据结构来处理解析,但这里似乎可以使用单个整数计数。

上面的脚本输出如下:

(expr1(expr2))
(Here is (another (deeply nested)))

匿名用户

您可以使用如下内容:^(expresion | expresion2)$

  • ^在行首断言位置