我希望这个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\
(没有转义的右括号)。我猜想我对否定超前构造的用法在某种程度上是不正确的。有人可以用我的正则表达式解释问题吗?谢谢。 最佳答案
您甚至都不需要四处看看。只需使用否定的字符类[^\\]
并将其包括在组中:
%(.*?)\((.*?[^\\])\)