随机字符串中的否定前瞻

时间:2018-05-22 18:22:19

标签: regex regex-lookarounds negative-lookahead

我希望过滤以Model结尾但不以ViewModel结尾的字词。 Model

前面至少还需要2个字符
MyModel // - do match
MyViewModel // - do not match

所以我认为这很容易,这种负面的前瞻应该足够好了。但 它不按我想要的方式工作。它也匹配ViewModel

^[a-z]{2,99}(?!View)Model$

Example on regex101

3 个答案:

答案 0 :(得分:2)

模式(?!A)B将始终与B匹配,因为显然您并未同时查看A和B.要检查B之前的内容,您可以使用(负面)后视:

^[a-z]{2,99}(?<!View)Model$

那为什么没有前瞻工作呢?

匹配就是这样(没有回溯)

MyView       |  ^[a-z]{2,99}              // Match as much as we can 
             |              (?!View)      // No "View" ahead, so we're good
      Model  |                      Model // normal match

答案 1 :(得分:0)

您可以将\w*后跟ViewModel的任何字词匹配为零或多次,并在一组中捕获2个或多个单词字符\w{2,},后跟Model

通过这种方式,您可以匹配您不想要的内容,并在组中捕获您想要的内容。

您的比赛是在第1组中进行的。

\w*ViewModel|(\w{2,}Model)\b

<强>详情

  • \w*匹配零个或多个单词字符
  • ViewModel按字面意思匹配
  • |
  • (\w{2,}Model)在一组中捕获2个或更多单词字符,然后是模型
  • \b字边界

答案 2 :(得分:0)

并非所有的正则表达式都支持像JS一样的{jou (?<=...) / (?<!...)(Chrome目前为止提供支持)。但你可以使用前瞻来解决这个问题:

\b(?!\w*ViewModel\b)\w{2,}Model\b

Live demo

故障:

  • \b匹配字边界
  • (?!开始否定前瞻
    • \w*ViewModel\b Word不应该以{{1​​}}
    • 结尾
  • ViewModel前瞻结束
  • )匹配以\w{2,}Model\b
  • 结尾的整个单词