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)))
https://regex101.com/r/Nvjtqj/1
为什么这个正则表达式仍然找到短语“相同问题”,即使它前面包含单词“had”?
您需要排除与您想要的过去时态动词的所有匹配项,然后匹配您需要的内容:
(\b(?:i\s+)?(?:have\s+)?)(?:had|faced)\s+((?:the\s+)?same\s+(?:problem|question|issue|here))(*SKIP)(*F)|(?1)(?2)
查看正则表达式演示
细节
(\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)-had或faced\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 组模式