2011-10-18 118 views
23

我試圖把一個正則表達式找出何時存在特定單詞不是存在於一個字符串中。具體來說,我想知道什麼時候「trunk」,「tags」或「branches」不存在(這是針對Subversion預先提交的鉤子)。基於該Regular expression to match string not containing a word答案,我可以爲一個字使用負查找變通容易做到這一點:正則表達式不包含多個特定單詞的字符串

^((?!trunk).)*$ 

這是「和」運營商,我掙扎,我似乎無法得到的組合,包括其他兩個字的工作。

這是運行在.NET罰款就是一個字:

var exp = new Regex(@"^((?!trunk).)*$"); 
exp.IsMatch("trunk/blah/blah"); 

,將返回False,因爲它目前爲或將「樹幹」不會在第二行的路徑存在如此。

缺少什麼我在這裏?

+0

爲什麼你不能只是做一個正常的「搜索」正則表達式和反轉的結果呢? –

+1

我受限於只能編輯正則表達式,而不是周圍的邏輯。 –

回答

56

使用負look-ahead某處斷言沒有任何三個字輸入:

^(?!.*(trunk|tags|branches)).*$ 

我也稍作整理你的正則表達式來糾正小錯誤。

+1

有一個無與倫比的開放式支架,假設它是無關緊要的,它不適用於「blah/blah/blah」之類的模式(不匹配返回)。 –

+0

@TroyHunt糟糕 - 遺漏了一個支架。我測試了它,它適用於我(儘管在java中)。現在試試。 – Bohemian

+0

完美,現在工作得很好:) –

3

使用「標準」的比賽,並查找!IsMatch

var exp = new Regex(@"trunk|tags|branches"); 
var result = !exp.IsMatch("trunk/blah/blah"); 

爲什麼人的愛,使他們的生活困難?

啊...並記住ass的原則! http://www.codinghorror.com/blog/2008/10/obscenity-filters-bad-idea-or-incredibly-intercoursing-bad-idea.html

因此,這將是更好的寫

var exp = new Regex(@"\b(trunk|tags|branches)\b"); 

但如果你真的需要一個負lookahed表達,並緊跟ass原則

var exp = new Regex(@"^(?!.*\b(trunk|tags|branches)\b)"; 

測試儀:http://gskinner.com/RegExr/?2uv1g

我會注意到,如果你正在尋找完整路徑(單詞/\)然後

var exp = new Regex(@"^(?!.*(^|\\|/)(trunk|tags|branches)(/|\\|$))"; 

測試儀:http://gskinner.com/RegExr/?2uv1p

+0

謝謝,但不幸的是,在這種情況下的約束需要在正則表達式中完成工作,而且我無法控制此外的代碼以反轉條件。 –

+0

@TroyHunt已更改 – xanatos

相關問題