我希望这个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\
(没有逃脱的右翼)。我猜测我对阴性前瞻构造的使用是不正确的。有人可以用我的正则表达式来解释这个问题吗?感谢。
答案 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)
你甚至不需要环顾四周。只需使用否定的字符类[^\\]
并将其包含在组中:
%(.*?)\((.*?[^\\])\)