我希望这个 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\
(没有转义的右括号)。我猜我对负先行构造的使用不知何故不正确。有人可以用我的正则表达式解释这个问题吗?谢谢。
最佳答案
您甚至不需要环顾四周。只需使用否定字符类 [^\\]
并将其包含在组中:
%(.*?)\((.*?[^\\])\)
关于java - 如何正确使用此 Java 正则表达式的否定先行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11589041/