正则表达式负向预查问题:匹配Model结尾非ViewModel结尾的单词
解决正则匹配以Model结尾但排除ViewModel的问题
嘿,我来帮你搞定这个正则问题!你之前的表达式之所以会错误匹配ViewModel,是因为否定前瞻的位置没放对,咱们一步步来修正它。
先明确需求的三个核心条件
- 单词必须以
Model结尾 - 单词不能以
ViewModel结尾 Model前面至少要有2个字符
原正则的问题分析
你写的^[a-z]{2,99}(?!View)Model$逻辑有漏洞:(?!View)是在匹配完前面的字母后、Model前做检查,但对于ViewModel来说,[a-z]{2,99}会匹配View这四个字符,此时后面跟着的是Model而不是View,所以这个前瞻条件会被判定为满足,最终错误匹配了ViewModel。
两种正确的正则方案
方案一:使用负向回顾后发断言
这个方案直接检查Model前面紧邻的内容是不是View,从根源排除不符合的情况:
^[a-zA-Z]{2,}(?<!View)Model$
各部分解释:
^:匹配字符串开头[a-zA-Z]{2,}:匹配至少2个大小写字母(如果需要支持下划线等字符,可改成\w{2,})(?<!View):负向回顾后发断言,确保Model开头的位置前面不是ViewModel$:匹配字符串结尾的Model
方案二:先排除所有以ViewModel结尾的情况
这个方案先通过前瞻排除不符合的字符串,再匹配符合条件的内容:
^(?!.*ViewModel$)[a-zA-Z]{2,}Model$
各部分解释:
^(?!.*ViewModel$):正向否定前瞻,确保整个字符串不是以ViewModel结尾[a-zA-Z]{2,}Model$:匹配以Model结尾且前面至少有2个字母的字符串
验证示例
- ✅
MyModel:符合所有条件,两种正则都能匹配 - ❌
MyViewModel:被排除,两种正则都不匹配 - ❌
Model:Model前面没有字符,不满足条件 - ❌
AModel:Model前面只有1个字符,不满足条件 - ❌
ViewModel:被排除,不匹配
内容的提问来源于stack exchange,提问作者ChristmasAnon
相关产品推荐
相关产品推荐

