Regex 随机字符串中的负前瞻

Regex 随机字符串中的负前瞻,regex,regex-lookarounds,negative-lookahead,Regex,Regex Lookarounds,Negative Lookahead,我想筛选以Model结尾但不以ViewModel结尾的单词。Model MyModel // - do match MyViewModel // - do not match 所以我认为这很容易,这种消极的前瞻应该足够好了。但是 它没有按我希望的方式工作。它也在匹配ViewModel ^[a-z]{2,99}(?!View)Model$ 模式(?!A)B将始终与B匹配,因为显然您没有同时查看A和B。要检查B之前的内容,可以使用(负片)查看后面: 那么为什么前瞻没有起作用呢 匹配过程如下(没

我想筛选以
Model
结尾但不以
ViewModel
结尾的单词。
Model

MyModel // - do match
MyViewModel // - do not match
所以我认为这很容易,这种消极的前瞻应该足够好了。但是 它没有按我希望的方式工作。它也在匹配
ViewModel

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

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

那么为什么前瞻没有起作用呢

匹配过程如下(没有回溯)

模式
(?!A)B
将始终与B匹配,因为很明显,您没有同时查看A和B。要检查B之前的内容,可以使用(负片)查看后面:

那么为什么前瞻没有起作用呢

匹配过程如下(没有回溯)


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

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

你的对手在第1组

详细信息

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

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

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

你的对手在第1组

详细信息

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

  • 并非所有的正则表达式风格都支持lookbehinds
    (?
    

    细分:

    • \b
      匹配单词边界
    • (?!
      开始负前瞻
      • \w*ViewModel\b
        Word不应以
        ViewModel
    • 前瞻结束
    • \w{2,}Model\b
      匹配以
      Model

    • 并非所有的正则表达式风格都支持lookbehinds
      (?
      

      细分:

      • \b
        匹配单词边界
      • (?!
        开始负前瞻
        • \w*ViewModel\b
          Word不应以
          ViewModel
      • 前瞻结束
      • \w{2,}Model\b
        匹配以
        Model

      你的风格/语言是什么?另外,你能分享更多关于什么应该匹配,什么不应该匹配的例子吗?我想你想看看后面。
      (?不
      (?!
      @zzxyz似乎你是对的。虽然我不明白为什么会这样。你可能想把它作为答案发布。你的风格/语言是什么?另外,你能分享一些关于什么应该匹配什么不匹配的例子吗?我想你想看看后面。
      (?不是
      (?!
      @zzxyz您似乎是对的。虽然我不明白为什么这样做有效。您可能想将其作为答案发布。我知道“前瞻”是错误的,但不太清楚为什么……我仍然不确定我是否理解此答案。我猜在“前瞻”中,
      视图
      在某种程度上与左侧的内容相对应……或多或少“不管怎样”@zzxyz我添加了一些细节,这有帮助吗?是的,谢谢:)我基本上有一个正确的想法,但这确实巩固了它。我知道“前瞻”是错误的,但不太清楚为什么…我仍然不确定我是否得到了这个答案。我猜在“前瞻”中,
      视图
      在某种程度上是锚定在左边的东西上的……这或多或少是“随便什么”“?@zzxyz我添加了一些细节,这有帮助吗?是的,谢谢:)我基本上有正确的想法,但这确实巩固了它。
      MyView       |  ^[a-z]{2,99}              // Match as much as we can 
                   |              (?!View)      // No "View" ahead, so we're good
            Model  |                      Model // normal match
      
      \b(?!\w*ViewModel\b)\w{2,}Model\b