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

Java 匹配偶数方括号的正则表达式,java,regex,brackets,Java,Regex,Brackets,我试图使正则表达式捕捉括号中的表达式,但当括号中有多个部分时,正则表达式会在第一次结束时停止。一个例子可以更好地解释这一点: (expr) #simple, it will catch "(expr)" (expr1(expr2)) #there is bad cuz it catches "(expr1(expr2)" 我想要“(expr1(expr2))” 我目前正在使用这个“\\(.*?\)”但是它没有给我想要的东西。你可以这样使用:^(expresion | ex

我试图使正则表达式捕捉括号中的表达式,但当括号中有多个部分时,正则表达式会在第一次结束时停止。一个例子可以更好地解释这一点:

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

(expr1(expr2))  #there is bad cuz it catches "(expr1(expr2)"
我想要“(expr1(expr2))”


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

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

  • ^在行的开始处断言位置
  • $断言行末尾的位置
  • |它的用法类似于或运算符
  • ()将表达式分开

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

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