【问题标题】:Regex: negative lookbehind AND negative lookahead正则表达式:负后瞻和负前瞻
【发布时间】:2021-10-11 23:20:03
【问题描述】:

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

(?<!me)gay

gay(?!acht)

但使用

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

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

【问题讨论】:

    标签: regex regex-lookarounds regex-negation


    【解决方案1】:

    使用

    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
    

    【讨论】:

      【解决方案2】:

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

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

      regex demo

      【讨论】:

      • 我注意到第一个\b 必须在后面的外部,但不知道为什么。你能告诉我为什么吗?
      • @ChrisRuehlemann 单词边界应该放在前瞻之外,因为模式应该从单词边界匹配的当前位置断言,直接在右边的不是单词。如果将其放在前瞻中,则逻辑会有所不同。它以断言声明开始:如果从当前位置是单词边界,则后面的单词不是直接向右。该断言在egayacht之前的位置是正确的
      【解决方案3】:

      您可以使用交替模式:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-14
        • 2010-12-17
        • 1970-01-01
        相关资源
        最近更新 更多