2011-05-11 183 views
3

如何合併正則表達式?合併正則表達式

編輯:這是否爲考試準備。問題是編寫一個正則表達式來查找所有具有奇數個a和偶數個b的字符串?

即代替|對於OR,我需要一種機制來仿真和

我有兩個正則表達式:

1) to find odd number of a's: 

^[^a]*a([^a]*a[^a]*a)*[^a]*$ 

2) to find even number of b's: 

^([^b]*b[^b]*b)*[^b]*$ 
+1

雖然構建這樣的正則表達式可能是可能的,但它會非常複雜(請記住,正則表達式只是一個狀態機,每個輸入字符都會爲其定時一次)。你可能會更好地運行兩個單獨的正則表達式,並對結果進行「與」運算。 – 2011-05-11 13:57:48

+0

我完全同意奧利,但我很好奇的實際答案:-) – 2011-05-11 13:59:49

+0

這是可能的構建這樣的正則表達式[與現有的相同的原則構建,只有更多],但不能結合兩個現有的正則表達式與一些運算符(perl中的maye除外,我從來不確定perl正則表達式的侷限性,以及零寬度預覽匹配或其他),我懷疑「找到所有有奇數個字符串的字符串a和偶數個b「是他的實際問題。 – Random832 2011-05-11 14:00:11

回答

6

你可以做到這一點使用lookahead expressions(此處顯示爲一個詳細的正則表達式,因爲它實在是太難看了,更加上單行):

^         # start of string 
(?=(?:(?:[^a]*a){2})*[^a]*$)  # assert an even number of as 
(?=[^b]*b(?:(?:[^b]*b){2})*[^b]*$) # assert an odd number of bs 
.*         # match anything 
$         # end of string 

如果您只是驗證,最後兩行可以被刪除 - 它們只是匹配整個字符串。

+0

+1打我吧 – 2011-05-11 14:03:05

+0

@Tim - 謝謝,這是在兩個正則表達式組件中都能看到的常見做法嗎? – user559142 2011-05-11 14:04:29

+0

有沒有辦法做到這一點,而不是它錨定到行末?就像你想用c + {thing} c +'在「ccccababacccc」中匹配它一樣? – Random832 2011-05-11 14:06:23