代码之家  ›  专栏  ›  技术社区  ›  Dharman vijay

如何匹配“have”,而不是“had”

  •  0
  • Dharman vijay  · 技术社区  · 6 年前

    我想把这样的短语搭配起来:

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

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

    • 我也有同样的问题
    • 我也有同样的问题

    稍后,我将用过去时态添加其他单词。

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

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

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

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

    2 回复  |  直到 6 年前
        1
  •  5
  •   Wiktor Stribiżew    6 年前

    你需要排除所有与你想要的动词过去时匹配的词,然后匹配你需要的词:

    (\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+)?) -第一组:
        • \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) -组中的一个单词
    • | -或匹配并返回以下匹配项:
      • (?1) -第1组重复模式
      • (?2) -第2组模式重复
        2
  •  1
  •   oriberu    6 年前

    当你不锚定你的lookarounds时,正则表达式引擎会简单地放弃一个单词,以便使表达式匹配——在本例中是“the”,因为“same”前面没有“had”的问题。

    请注意,这扩展了一个表达式可以和应该执行的操作的限制,并进入了多个检查和解析器的领域。如果你需要用一个表达式来表达,它可以是这样的:

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

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

    推荐文章