我正在尝试使正则表达式能够捕获括号中的表达式,但是当括号中有多个部分时,正则表达式会在第一次关闭时停止。一个例子可以更好地解释它:
(expr) #simple, it will catch "(expr)"
(expr1(expr2)) #there is bad cuz it catches "(expr1(expr2)"
我想要“。(expr1(expr2))”
我目前正在使用此"\\((.*?)\\)"
,但它没有提供我想要的东西。
答案 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)$