3

我希望这个 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

但它没有(如本测试所示)。

对于此输入:

%foo(%bar \(%baz\)) hello world)

我期待%bar \(%baz\)但看到%bar \(%baz\(没有逃脱的右括号)。我猜我对负前瞻结构的使用在某种程度上是不正确的。有人可以解释我的正则表达式的问题吗?谢谢。

4

2 回答 2

1

我解决了这个问题。当我实际上需要负后瞻时,我正在使用负前瞻。

正则表达式应该是:

%(.*?)      # match all text that immediately follows a '%'
\(          # match a literal left-paren
(.*?)       # match all text that immediately follows the left-paren
(?<!\\)     # negative lookbehind for right-paren: if not preceded by slash...
\)          # match a literal right-paren

此处演示了此修复程序。

于 2012-07-21T04:07:35.443 回答
1

你甚至不需要环顾四周。只需使用否定字符类[^\\]并将其包含在组中:

%(.*?)\((.*?[^\\])\)
于 2012-07-21T04:46:11.923 回答