【问题标题】:Match specific length x or y匹配特定长度 x 或 y
【发布时间】: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


    【解决方案1】:

    有一种方法:

    ^(?=[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 的备用版本,它适用于所有浏览器。
    • 请注意,由于非捕获组 (?:),XML 架构不支持这两个版本。
    • (?=^(.{8}|.{11})$)^[0-9]*$ 因为 ?= 不捕获模式,所以我们可以省略 '?:'
    • @user1438644:前瞻不参与比赛,但如果其中有捕获组,他们捕获其内容。由于捕获和存储会减慢正则表达式的速度,因此我只在需要时使用捕获组。这就是为什么我不会省略 ?: 部分。
    【解决方案2】:

    使用 Perl,您可以:

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

    【讨论】:

    • 关闭,但在$re{3之后错过了一个}
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 2012-03-27
      • 2020-10-16
      • 2021-08-18
      相关资源
      最近更新 更多