2010-01-22 144 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

相關問題