随机字符串中的负先行

Negative Lookahead within a random string

我想过滤以 Model 结尾但不以 ViewModel 结尾的单词。 Model

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

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

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

Example on regex101

模式 (?!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

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

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

你的比赛在第 1 组中。

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

详情

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

并不是所有的正则表达式风格都像 JS 一样支持后视 (?<=...) / (?<!...)(Chrome 到目前为止有支持)。但是您可以使用先行解决此问题:

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

Live demo

细分:

  • \b匹配单词边界
  • (?! 负先行开始
    • \w*ViewModel\b 单词不应以 ViewModel
    • 结尾
  • ) 前瞻结束
  • \w{2,}Model\b 匹配以 Model
  • 结尾的整个单词