这种正负前瞻的组合有什么作用?

What does this combination of positive and negative lookahead do?

最近我偶然发现了这个奇怪的 REGEX,它结合了积极和消极的前瞻性,我无法理解它到底做了什么。请记住,这是一些 Java 正则表达式语法。

(?=((?!\bword1\b|\bword2\b).)+?\s*?)
 ^^  ^^

这两个嵌套前瞻有什么作用?这可以简化吗?

  • .如果在“word1”或“word2”中不是“w”则匹配(可以简化\bword1\b|\bword2\b\bword[12]\b),在non-words之间。这就是否定断言的意思,
  • +?表示至少一个这样的.,
  • 但实际上只有一个,因为量词是non-greedy,后面跟着总是匹配的\s*。因此+?可以去掉,
  • \s*? 在这个断言中是没有意义的,因为它总是匹配,并且不消耗任何输入,并且后面没有任何东西,
  • 这里的肯定lookahead断言(?=...)表示该位置后跟任何字符(除了上面描述的“w”“word”等)。

进一步的简化将删除组捕获,这在上下文中可能是必需的。

所以,简化的正则表达式是 (?=((?!\bword[12]\b).))。它会在输入的任何字符之前成功,除了 non-words 之间的“word1”或“word2”的开头。匹配项将为空,但第一个捕获组将包含以下字符。

https://regex101.com/r/O10c3u/1