如何正确使用这个Java正则表达式的负向前瞻?

时间:2012-07-21 02:37:36

标签: java regex negative-lookahead

我希望这个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\(没有逃脱的右翼)。我猜测我对阴性前瞻构造的使用是不正确的。有人可以用我的正则表达式来解释这个问题吗?感谢。

2 个答案:

答案 0 :(得分:1)

我弄明白了这个问题。当我实际需要负面的 lookbehind 时,我正在使用负向前瞻。

正则表达式应该是:

%(.*?)      # 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

此修复程序已演示here

答案 1 :(得分:1)

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

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