2013-06-19 131 views
0

我對理解正則表達式有很多問題,我不確定我想要做什麼是可能的。正則表達式包含多個字符串

我想要一個正則表達式能夠以任何順序與包含「a」和「b」的字符串匹配。

例子:

rrrarrbrr 

比賽

rrrbrrarar 

比賽

rrrbbbrrr 

這麼想的比賽

是否有可能做到這一點與正則表達式的幫助? 在此先感謝

+2

http://www.regular-expressions.info/tutorial.html –

回答

3

雖然p.s.w.g的答案肯定是正確的,但它並沒有真正推廣到兩個以上的字符(你必須包含字符順序的每個可能的排列)。通常情況下,使上輸入多斷言,我們使用向前看符號:

^(?=.*a)(?=.*b) 

^錨表達對字符串的開頭。這更像是一種優化,稍微有助於理解(如果條件不能在字符串的開始處匹配,則不需要在稍後的位置再次檢查它們)。然後向前看(?=...)檢查在字符串的某處有一個a。但是前瞻並沒有真正提前在字符串中的位置(它只有看起來提前),所以我們仍然在字符串的開始處,現在可以檢查另一個條件(在字符串的某處存在b) 。通過這種方式,您可以輕鬆添加多個條件,而不必考慮字符串在哪裏實現。

當然,由於p.s.w.g.也表示,對於單個角色而言,根本不需要使用正則表達式,但如果您想一次檢查多個更復雜的模式,則此技術可能非常有用。

我強烈建議您閱讀this tutorial以使您瞭解正則表達式。他們真的看起來比實際上更令人畏懼。它也有一個部分(或更確切的說是兩個)on lookarounds

+0

+1好戲,我得記住這個。儘管它似乎只適用於測試比賽。這怎麼能用來捕捉字符串的'a ... b'部分? (不是OP的問題的一部分,我只是好奇) –

+0

@ p.s.w.g如果你的環境支持它,你可以捕獲'a'和'b'(以及捕獲在字符串中的位置)並手動提取子字符串。 –

6

您可以使用此模式:

a.*b|b.*a 

正如

bool containsAandB = Regex.IsMatch(input, "a.*b|b.*a"); 

或者簡單:如果你處理大投入

bool containsAandB = input.Contains("a") && input.Contains("b"); 

,你想迭代在字符串只有一次,一點Linq可以幫助:

bool containsAandB = input.Where(c => c == 'a' || c == 'b') 
          .Distinct().Take(2).Count() == 2; 
+2

是的,沒必要僅僅因爲問題涉及字符串而使用正則表達式。 –

+0

@MichaelMyers那麼,正則表達式的版本遍歷字符串兩次而不是一次。不知道這個例子中的正則表達式會更快,但是... – Nolonar

+0

@Nolonar Linq在這種情況下可以提供幫助。看到我更新的答案,*應*是最快的解決方案。 –

相關問題