我希望这个Java正则表达式可以匹配两个括号之间的所有文本:

%(.*?)\((.*?)(?!\\)\)

显示带有注释:
%(.*?)      # match all text that immediately follows a '%'
\(          # match a literal left-paren
(.*?)       # match all text that immediately follows the left-paren
(?!\\)      # negative lookahead for right-paren: if not preceded by slash...
\)          # match a literal right-paren

但事实并非如此(如test中所示)。

对于此输入:

%foo(%bar \(%baz\)) hello world)
我期望%bar \(%baz\),但是看到了%bar \(%baz\(没有转义的右括号)。我猜想我对否定超前构造的用法在某种程度上是不正确的。有人可以用我的正则表达式解释问题吗?谢谢。

最佳答案

您甚至都不需要四处看看。只需使用否定的字符类[^\\]并将其包括在组中:

%(.*?)\((.*?[^\\])\)

10-06 03:05