(如何)可以在下面的正則表達式進行簡化:簡化正則表達式 「AB | A | B」
ab|a|b
?
我正在尋找一個不太多餘的,即只有一個a
和一個b
。可能嗎?
一些嘗試:
a?b? # matches empty string while shouldn't
ab?|b # still two b
注意,真正的正則表達式有更復雜a
和b
部分,即不是單個字符,但內subregexes讓我們說。
(如何)可以在下面的正則表達式進行簡化:簡化正則表達式 「AB | A | B」
ab|a|b
?
我正在尋找一個不太多餘的,即只有一個a
和一個b
。可能嗎?
一些嘗試:
a?b? # matches empty string while shouldn't
ab?|b # still two b
注意,真正的正則表達式有更復雜a
和b
部分,即不是單個字符,但內subregexes讓我們說。
如果你正在使用Perl或一些PCRE引擎(如PHP的preg_
功能),你可以參考以前的羣體格局,這樣的:
/(a)(b)|(?1)|(?2)/
此功能的主要目的是支持遞歸,但它也可以用於模式重用。
請注意,在這種情況下,您無法在第一次輪換時避開a
和b
,這會導致一些(可能)不必要的開銷。爲了避免這種情況,您可以在永不執行的條件內定義組。該規範的方式做,這是使用(?(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
,a
和b
(其中第一個也是後兩者的拼接)。
我的直覺告訴我它不能簡化 – 2013-04-25 14:25:45
'[ab] {1,2}'也許? – leppie 2013-04-25 14:27:21
是否有你需要簡化這個正則表達式的原因?雖然有一點冗餘,但它仍然非常簡單易讀。 – Jeff 2013-04-25 14:27:26