正则表达式:负向后看和负向前看

Regex: negative lookbehind AND negative lookahead

我想匹配单词 gay 除非它是单词 megayacht 的一部分。我知道我可以使用负前瞻和负后视来从匹配中排除 gayachtmegay,例如

(?<!me)gay

gay(?!acht)

但使用

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

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

您可以排除匹配 megayacht 并匹配包含 gay

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

regex demo

您可以使用交替模式:

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

使用

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

参见regex proof

解释

--------------------------------------------------------------------------------
  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