如何匹配“有”,而不是“有”

Dha*_*man -1 php regex preg-match regex-lookarounds

我想匹配这样的短语:

  • 有同样的问题
  • 面临同样的问题
  • 有同样的问题
  • 我遇到了同样的问题
  • 我看到同样的问题
  • 我有同样的问题

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

  • 我遇到过同样的问题
  • 有同样的问题

稍后,我将添加其他过去时的词。

我试过这个正则表达式,但它仍然匹配“相同的问题”,即使前面有“有”这个词

((?:i\s)?(?:have\s)?(?<!had\s)(?:(?:the\s|a\s)?same\s(?:(?:problem|question|issue)|here)))
Run Code Online (Sandbox Code Playgroud)

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

为什么这个正则表达式仍然找到短语“相同问题”,即使它前面包含单词“had”?

Wik*_*żew 5

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

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

查看正则表达式演示

细节

  • (\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+)?- 一个可选的组匹配 ahave然后 1+ 空格
    • (?:had|faced)-hadfaced
    • \s+ - 1+ 个空格
    • ((?:the\s+)?same\s+(?:problem|question|issue|here)) - 第 2 组:
      • (?:the\s+)?- 一个可选的组匹配 athe然后 1+ 空格
      • same\s+-same和 1+ 个空格
      • (?:problem|question|issue|here) - 组中的一个词
  • | - 或匹配并返回以下匹配项:
    • (?1) - 重复第 1 组模式
    • (?2) - 重复第 2 组模式