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

时间:2018-12-23 13:49:05

标签: java regex brackets

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

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

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

我想要“。(expr1(expr2))”

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

2 个答案:

答案 0 :(得分: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));
        }
    }
}

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

上面的脚本输出以下内容:

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

答案 1 :(得分:0)

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

  • ^声明行首的位置
  • $在行尾声明位置
  • |它就像或运算符一样使用
  • ()分隔表达式