RegExp匹配字符串不是以我的开头


89

对于PMD,我希望有一条规则可以警告我以开头的丑陋变量my
这意味着我必须接受所有不以开头的变量my

因此,我需要一个表现如下的RegEx(re):

re.match('myVar')       == false
re.match('manager')     == true
re.match('thisIsMyVar') == true
re.match('myOtherVar')  == false
re.match('stuff')       == true

我尝试了不同的方法,但是还没有开始。


1
我认为实际上应该是负面的看法(而不是正面的负面看法)。
Indrit 2011年

Answers:


42

您可以像其他人建议的那样使用先行断言。或者,如果您只想使用基本的正则表达式语法:

^(.?$|[^m].+|m[^y].*)

这将匹配长度为零或一个字符(^.?$)的字符串,因此不能为my。或具有两个或多个字符的字符串,如果第一个字符不再存在,则m可以跟在(^[^m].+)之后;或者,如果第一个字符是a,m则不能在其后跟y^m[^y])。


这是我们现在可以使用的那个。似乎扩展的regexp存在问题,但是此功能目前可以正常使用。
多米尼克·桑贾贾

165
^(?!my)\w+$

应该管用。

它首先确保不可能my在字符串的开头进行匹配,然后再匹配字母数字字符直到字符串的末尾。字符串中任何地方的空格都会导致正则表达式失败。根据您的输入,您可能想要在将字符串传递至regex之前在字符串的前面和后面去除空格,或者使用将可选的空格匹配项添加到regex中,例如^\s*(?!my)(\w+)\s*$。在这种情况下,后向引用1将包含变量的名称。

并且,如果您需要确保变量名以一组特定字符开头,例如[A-Za-z_],请使用

^(?!my)[A-Za-z_]\w*$

请注意从更改+*


59
/^(?!my).*/

(?!expression)是负面的前瞻;它匹配一个从该位置开始expression 匹配的位置。


7

做一个肯定的匹配并拒绝那些字符串难道不是更具可读性-而不是匹配否定的找到要接受的字符串吗?

/^my/

4
但是(对于)在提交到存储库时检查代码的规则来说,这将是更容易的,因此无法“还原”逻辑。
多米尼克·桑贾贾
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.