2012-10-08 39 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,......)的倍数。