java - 如何正确使用此 Java 正则表达式的否定先行?

标签 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\ (没有转义的右括号)。我猜我对负先行构造的使用不知何故不正确。有人可以用我的正则表达式解释这个问题吗?谢谢。

最佳答案

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

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

关于java - 如何正确使用此 Java 正则表达式的否定先行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11589041/

相关文章:

java - 访问 Web 服务时出现 NoClassDefFoundError

java - charAt() 和 Math.pow()

java - JavaFX 颜色选择器的语言

python - 在 ply 的正则表达式中匹配 unicode

java - 是否可以在 regex java 中定义前瞻范围?

Java 时间戳值

java - 在 Java 中拆分字符串会抛出 PatternSyntaxException

regex - 正则表达式 - 负前瞻

regex - 正则表达式 : Replacing Portions of a Regex Match

c++ - regex_replace 在 Windows 上不起作用