如何匹配 "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)
详情
(\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)
- had
或 faced
\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 组模式重复
我想匹配这样的短语:
- 有同样的问题
- 面临同样的问题
- 有同样问题
- 我遇到了同样的问题
- 我看到了同样的问题
- 我有同样的问题
但是如果它们是过去时,我不想匹配它们,这意味着例如应该排除任何包含单词 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)
详情
(\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)
-had
或faced
\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 组模式重复