【发布时间】:2012-10-08 15:01:31
【问题描述】:
我想要一个长度为 X 或 Y 字符的正则表达式。例如,匹配长度为 8 或 11 个字符的字符串。我目前已经这样实现了:^([0-9]{8}|[0-9]{11})$.
我也可以将其实现为:^[0-9]{8}([0-9]{3})?$
我的问题是:我可以在不复制[0-9] 部分的情况下使用这个正则表达式(这比这个简单的\d 示例更复杂)吗?
【问题讨论】:
标签: regex
我想要一个长度为 X 或 Y 字符的正则表达式。例如,匹配长度为 8 或 11 个字符的字符串。我目前已经这样实现了:^([0-9]{8}|[0-9]{11})$.
我也可以将其实现为:^[0-9]{8}([0-9]{3})?$
我的问题是:我可以在不复制[0-9] 部分的情况下使用这个正则表达式(这比这个简单的\d 示例更复杂)吗?
【问题讨论】:
标签: regex
有一种方法:
^(?=[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-9]*$)(?:.{8}|.{11})$ 版本,它可能对IE5-8 有错误,正如here 所解释的那样。切换到 Tim 的备用版本,它适用于所有浏览器。
?: 部分。
使用 Perl,您可以:
my $re = qr/here_is_your_regex_part/;
my $full_regex = qr/$re{8}(?:$re{3})?$/
【讨论】:
$re{3之后错过了一个}
对于我们这些想要捕捉相同倍数的不同长度的人来说,试试这个。
^(?:[0-9]{32})+$
其中32 是您要捕获所有长度的倍数 (32, 64, 96, ...)。
【讨论】: