我试图使正则表达式捕获括号中的表达式,但是当有多个括号部分时,正则表达式在第一次关闭时停止。一个例子会更好地解释它:
(expr) #simple, it will catch "(expr)"
(expr1(expr2)) #there is bad cuz it catches "(expr1(expr2)"
我想要(expr1(expr2))
我目前正在使用此“\\(.*?\)”但是它没有给我想要的。
您试图解决的问题通常不适合正则表达式,因为任意嵌套的内容不是正则文本。相反,您可能需要考虑编写某种解析器来查找嵌套术语。这里有一个建议脚本:
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)))
您可以使用如下内容:^(expresion | expresion2)$