我喜欢长度为X或Y字符的正则表达式。例如,匹配长度为8或11个字符的字符串。我目前正如此实现:^([0-9]{8}|[0-9]{11})$
。
我也可以将其实现为:^[0-9]{8}([0-9]{3})?$
我的问题是:我是否可以使用此正则表达式而不重复[0-9]
部分(这比这个简单的\d
示例更复杂)?
答案 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,...)所有长度的倍数。