正则表达式:负向后顾和负向前瞻

6
我想匹配单词gay,除非它是单词megayacht的一部分。我知道我可以使用负向前视断言和负向后视断言来排除匹配中的gayachtmegay,例如:
(?<!me)gay

并且

gay(?!acht)

但使用

(?<!me)gay(?!acht)

仍将从匹配中排除megaygayacht,这不是我想要的。我找不到同时要求两者的方法。

3个回答

3
您可以使用交替模式:
(?<!me)gay|gay(?!acht)

3

您可以排除匹配megayacht并匹配包含gay单词的内容

\b(?!megayacht\b)\w*gay\w*

正则表达式演示


我注意到第一个\b必须位于回顾之外,但无法弄清原因。你能告诉我为什么吗? - Chris Ruehlemann
1
@ChrisRuehlemann 单词边界应该放在前瞻之外,因为模式应该从当前位置开始断言,单词边界匹配的地方直接右侧不是单词。如果将其放在前瞻中,则逻辑不同。它从断言开始,即如果从当前位置开始,单词边界后面不直接跟着单词。该断言在 egayacht 之前的位置是正确的。 - The fourth bird

3

使用

gay(?!(?<=megay)acht)

查看正则表达式证明

解释

--------------------------------------------------------------------------------
  gay                      'gay'
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    (?<=                     look behind to see if there is:
--------------------------------------------------------------------------------
      megay                    'megay'
--------------------------------------------------------------------------------
    )                        end of look-behind
--------------------------------------------------------------------------------
    acht                     'acht'
--------------------------------------------------------------------------------
  )                        end of look-ahead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接