【问题标题】:RegEx Matching even amount of brackets [duplicate]正则表达式匹配偶数的括号[重复]
【发布时间】:2018-12-23 13:49:04
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 匹配的括号数不能用正则语言表示,所以不能用正则表达式来完成。也就是说,您可以启用急切捕获,这将捕获您的情况下的第二个括号,但会导致进一步的非预期捕获。
  • (.*) 应该是好是好

标签: java regex brackets


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你可能会这样使用:^(expresion|expresion2)$

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

    【讨论】:

      猜你喜欢
      • 2015-06-23
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2019-04-18
      • 2011-07-15
      • 1970-01-01
      • 2011-08-03
      相关资源
      最近更新 更多