正则表达式匹配偶数个括号

RegEx Matching even amount of brackets

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

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

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

我想要 ". (expr1(expr2))"

我目前正在使用这个 "\((.*?)\)",但它没有给我想要的东西。

你可以使用这样的东西:^(表达式|表达式2)$

  • ^ 断言行首的位置
  • $ 断言行尾的位置
  • |它像 or operator
  • 一样使用
  • () 分隔表达式

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

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));
        }
    }
}

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

以上脚本输出如下:

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