2010-01-22 109 views
47

对于PMD,我希望有一条规则警告我那些以我的开头的丑陋变量。这意味着我必须接受所有不以我开头的变量。正则表达式匹配字符串不以我开头

所以,我需要一个正则表达式(RE),其行为如下:

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

我已经尝试了不同的人(这里将稍后一一列举了,对不起,没有进入他们现在),但避风港”没有得到它的工作。

+1

我认为其实应该是后面的负看看(不定向排除)。 – Indrit 2011-09-12 16:15:58

回答

31

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

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

此匹配较长(^.?$),因此不能my零个或一个字符的字符串。或者有两个或更多字符的字符串,当第一个字符不是m时,可能会有更多字符(^[^m].+);或者如果第一个字符是m,则不能后面跟着y^m[^y])。

+0

这是我们现在可以使用的一个。似乎扩展正则表达式存在问题,但现在这个工作正常。 – 2010-01-22 11:21:45

103
^(?!my)\w+$ 

应该工作。

它首先确保在字符串的起始处不可能匹配my,然后匹配字母数字字符直到字符串结束。字符串中任何位置的空格将导致正则表达式失败。取决于你的输入,你可能想要在字符串的前面和后面去掉空格,然后把它传递给正则表达式,或者使用可选的空白匹配器添加正则表达式,如^\s*(?!my)(\w+)\s*$。在这种情况下,反向引用1将包含变量的名称。

如果你需要确保你的变量名称具有一定的字符组开始,说[A-Za-z_],使用

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

注意的变化,从+*

34
/^(?!my).*/ 

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

5

做一个积极的匹配和拒绝这些字符串不会明显更具可读性 - 而不是匹配否定字符串来接受?

/^my/ 
+2

这会更容易,但它是()需要一个规则,当检查代码时提交到一个存储库,因此该逻辑不能“恢复”。 – 2011-09-13 06:59:11

相关问题