如何匹配 "have",但不匹配 "had"

How to match "have", but not "had"

我想匹配这样的短语:

但是如果它们是过去时,我不想匹配它们,这意味着例如应该排除任何包含单词 had 的内容:

以后再补充过去时的其他词

我试过这个正则表达式,但它仍然匹配 "the same issue",即使前面有单词 "had"

((?:i\s)?(?:have\s)?(?<!had\s)(?:(?:the\s|a\s)?same\s(?:(?:problem|question|issue)|here)))

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

为什么这个正则表达式仍然找到短语 "same issue",即使它前面包含单词 "had"?

当您不锚定环视时,正则表达式引擎将简单地放弃一个词以使表达式匹配 - 'the' 在这种情况下,因为 'same' 没有问题前面有 'had'.

请注意,这超出了您可以和应该使用一个表达式做什么的限制,并进入了多个检查和解析器的领域。如果你需要用一个表达式来做到这一点,它可能是这样的:

^(?!.*\b(?:had)\b)(?=.*same (?:problem|question|issue)).*

你从同一个固定位置做出肯定和否定的断言。

您需要排除所有与您想要的过去式动词匹配的内容,然后再匹配您需要的内容:

(\b(?:i\s+)?(?:have\s+)?)(?:had|faced)\s+((?:the\s+)?same\s+(?:problem|question|issue|here))(*SKIP)(*F)|(?1)(?2)

regex demo

详情

  • (\b(?:i\s+)?(?:have\s+)?)(?:had|faced)\s+((?:the\s+)?same\s+(?:problem|question|issue|here))(*SKIP)(*F) - (*SKIP)(*F) 将使正则表达式引擎丢弃与以下模式匹配的文本,并继续在失败的位置寻找匹配项:
    • (\b(?:i\s+)?(?:have\s+)?) - 第 1 组:
      • \b - 单词边界
      • (?:i\s+)? - 可选组匹配 i 然后是 1+ 个空格
      • (?:have\s+)? - 可选组匹配 have 然后是 1+ 个空格
    • (?:had|faced) - hadfaced
    • \s+ - 1+ 个空格
    • ((?:the\s+)?same\s+(?:problem|question|issue|here)) - 第 2 组:
      • (?:the\s+)? - 可选组匹配 the 然后是 1+ 个空格
      • same\s+ - same 和 1+ 个空格
      • (?:problem|question|issue|here) - 组中的单词之一
  • | - 或匹配和 return 以下匹配:
    • (?1) - 第 1 组模式重复
    • (?2) - 第 2 组模式重复