正则表达式 - 将同一句子中的单词与否定环视匹配

RegEx - Match Words in Same Sentence with Negative Lookaround

如果同一个句子中不存在另一个词(坏),我正在尝试匹配一个词(好)。我想使用 lookaround 来执行此操作,因为我只想在捕获的结果中包含第一个词(好)。

这是我的正则表达式:

(?<!\bbad\b[^.])\bgood\b(?![^.]+\bbad\b)

这在所有情况下都有效,除非我要找的词(好)在另一个词(坏)之前。

所以在下面的例子中,结果如下:

  1. 测试 1:错误正则表达式的一个很好的例子。 (没有匹配 - 通过)
  2. 测试 2:好的正则表达式的一个坏例子。 (找到匹配 - 失败)
  3. 测试 3:一个不好的例子。一个好的正则表达式。 (找到匹配 - 通过)
  4. 测试 4:一个很好的例子。一个糟糕的正则表达式。 (找到匹配 - 通过)

有人可以指出我在这里缺少的东西吗? Here's my test on regex101.com.

您可以使用这个正则表达式:

(?:^|\.)(?:(?!\b(?:bad|good)\b)[^.])*(\bgood\b)(?![^.]+\bbad\b)

RegEx Demo

正则表达式详细信息:

  • (?:^|\.):匹配起始位置或一个点
  • (?:(?!\b(?:bad|good)\b)[^.])*:如果前面没有单词goodbad,则匹配一个非点字符。重复此匹配 0 次或更多次
  • (\bgood\b):匹配全词good
  • (?![^.]+\bbad\b):否定前瞻断言我们没有一个或多个非点字符后跟单词,bad 在当前位置
  • 之前

如果支持 lookbehind 中的量词,您可以选择重复字符 class,排除匹配换行符。

(?<!\bbad\b[^.\n]*)\bgood\b(?![^.\n]+\bbad\b)

模式匹配:

  • (?<!\bbad\b[^.\n]*) 否定后视,断言左边不是单词 bad 后跟可选字符,不包括 . 或换行符
  • \bgood\b 匹配单词 good
  • (?![^.\n]+\bbad\b) 否定前瞻,断言右边不是可选字符,不包括 . 或换行符和单词 bad

Regex demo