匹配特定长度x或y

时间:2012-10-08 15:01:32

标签: regex

我喜欢长度为X或Y字符的正则表达式。例如,匹配长度为8或11个字符的字符串。我目前正如此实现:^([0-9]{8}|[0-9]{11})$

我也可以将其实现为:^[0-9]{8}([0-9]{3})?$

我的问题是:我是否可以使用此正则表达式而不重复[0-9]部分(这比这个简单的\d示例更复杂)?

3 个答案:

答案 0 :(得分:43)

有一种方法:

^(?=[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

答案 1 :(得分:2)

使用Perl,你可以这样做:

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

答案 2 :(得分:2)

对于我们这些想要捕获不同长度的同一倍数的人来说,试试这个。

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

其中32是要捕获(32,64,96,...)所有长度的倍数。