2012-10-08 38 views
20

我想要一個正則表達式,它可以是X或Y字符長度。例如,匹配長度爲8或11個字符的字符串。我目前已經實現了這樣的:^([0-9]{8}|[0-9]{11})$匹配特定長度x或y

我還可以實現它:^[0-9]{8}([0-9]{3})?$

我的問題是:我能有這樣的正則表達式,而不復制[0-9]部分(這是更復雜的比這個簡單的例子\d)?

回答

31

還有一種方法:

^(?=[0-9]*$)(?:.{8}|.{11})$ 

或另外,如果你想先做長度檢查,

^(?=(?:.{8}|.{11})$)[0-9]*$ 

這樣,你只需要複雜的部件一次,而且通用的.用於長度檢查。

說明:

^  # Start of string 
(?=  # Assert that the following regex can be matched here: 
[0-9]* # any number of digits (and nothing but digits) 
$  # until end of string 
)  # (End of lookahead) 
(?:  # Match either 
.{8} # 8 characters 
|  # or 
.{11} # 11 characters 
)  # (End of alternation) 
$  # End of string 
+0

非常好...我將不得不更多地瞭解這些lookaheads :) – Laoujin

+1

請注意:如果您採用'^(?= [0-9] * $)(?:。{8} |。{11} )$'版本,這可能是IE5-8的錯誤,正如解釋[這裏](http://blog.stevenlevithan.com/archives/regex-lookahead-bug)。切換到蒂姆的替代版本,它適用於所有瀏覽器。 – Laoujin

+0

注意由於非捕獲組(?:),XML模式不支持這兩個版本。 – user1056903

1

用Perl,你可以這樣做:

my $re = qr/here_is_your_regex_part/; 
my $full_regex = qr/$re{8}(?:$re{3})?$/ 
+1

關閉,但錯過了} $ re {3' – mrk

+0

@mrk:很好,謝謝。 – Toto

0

對於我們這些希望捕捉相同的多個不同長度的嘗試。

^(?:[0-9]{32})+$

哪裏32是要捕捉所有的長度(32,64,96,......)的倍數。