2013-04-25 258 views
3

(如何)可以在下面的正則表達式進行簡化:簡化正則表達式 「AB | A | B」

ab|a|b 

我正在尋找一個不太多餘的,即只有一個a和一個b。可能嗎?

一些嘗試:

a?b?  # matches empty string while shouldn't 
ab?|b  # still two b 

注意,真正的正則表達式有更復雜ab部分,即不是單個字符,但內subregexes讓我們說。

+0

我的直覺告訴我它不能簡化 – 2013-04-25 14:25:45

+0

'[ab] {1,2}'也許? – leppie 2013-04-25 14:27:21

+0

是否有你需要簡化這個正則表達式的原因?雖然有一點冗餘,但它仍然非常簡單易讀。 – Jeff 2013-04-25 14:27:26

回答

6

如果你正在使用Perl或一些PCRE引擎(如PHP的preg_功能),你可以參考以前的羣體格局,這樣的:

/(a)(b)|(?1)|(?2)/ 

此功能的主要目的是支持遞歸,但它也可以用於模式重用。

請注意,在這種情況下,您無法在第一次輪換時避開ab,這會導致一些(可能)不必要的開銷。爲了避免這種情況,您可以在永不執行的條件內定義組。該規範的方式做,這是使用(?(DEFINE)...)組(它檢查如果一個名爲DEFINE組匹配的東西,當然那組不存在):

/(?(DEFINE)(a)(b))(?1)(?2)|(?1)|(?2)/ 

如果您的引擎不支持(編輯:,因爲你使用的是Java,沒有不支持此功能),你可以在一個單一的模式獲得最佳的的確是

ab?|b 

或者,您可以通過連接字符串/手動構建ab|a|b版本格式像:

String a = "a"; 
String b = "b"; 
String pattern = a + b + "|" + a + "|" + b; 

這也避免了重複。或者,您可以針對主題字符串使用3種不同的模式ab,ab(其中第一個也是後兩者的拼接)。

+0

或者:'(ab?)| b'爲'可讀性' – leppie 2013-04-25 14:39:35

+1

@leppie我認爲這是主觀的,如果你這樣做,你應該使用'(?:ab? - 否則括號會導致不必要的開銷,通過捕獲'ab'(也許我應該將其添加到第一個解決方案) – 2013-04-25 14:40:57

+1

+1正則表達式:你每天都會學習一些新東西,甚至40年後; p – leppie 2013-04-25 14:41:46