我希望过滤以Model
结尾但不以ViewModel
结尾的字词。 Model
MyModel // - do match
MyViewModel // - do not match
所以我认为这很容易,这种负面的前瞻应该足够好了。但
它不按我想要的方式工作。它也匹配ViewModel
。
^[a-z]{2,99}(?!View)Model$
答案 0 :(得分:2)
模式(?!A)B
将始终与B匹配,因为显然您并未同时查看A和B.要检查B之前的内容,您可以使用(负面)后视:
那为什么没有前瞻工作呢?
匹配就是这样(没有回溯)
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)
在一组中捕获2个或更多单词字符,然后是模型\b
字边界答案 2 :(得分:0)
并非所有的正则表达式都支持像JS一样的{jou (?<=...)
/ (?<!...)
(Chrome目前为止提供支持)。但你可以使用前瞻来解决这个问题:
\b(?!\w*ViewModel\b)\w{2,}Model\b
故障:
\b
匹配字边界(?!
开始否定前瞻
\w*ViewModel\b
Word不应该以{{1}} ViewModel
前瞻结束)
匹配以\w{2,}Model\b