【问题标题】:Need regex to match 1 or more of exactly n-digit numbers需要正则表达式来匹配 1 个或多个精确的 n 位数字
【发布时间】:2011-02-18 17:53:26
【问题描述】:

我需要一个正则表达式来匹配一系列一个或多个 n 位数字,用逗号分隔,即:

abc12345def 返回 12345
abc12345,23456def 返回 12345,23456

到目前为止,我得到了这个:\d{5}(,\d{5})*

问题是它在以下情况下也匹配:

123456 返回 12345,但如果数字长于 5,我需要它不匹配。所以我需要正好 5 位的数字,如果数字更短或更长,则不匹配

谢谢

【问题讨论】:

    标签: regex


    【解决方案1】:

    您的正则表达式使用哪种语言?您想在\d{5} 周围放置非数字标记;这是 Perl 语法(Lukasz 对前瞻/后视进行了否定修复):

    (?<![\d,])\d{5}(,\d{5})*(?![\d,])
    

    【讨论】:

    • 其实我想我明白了! "(?
    • 这对我有用,捕获我没有的“部分匹配”(例如:abc12345,12345,123xyz
    • @Colin O'Dell:它不应该与这些情况相匹配,但我不确定是否已指定。当您根据输入进行测试时,我假设您将12345,12345 作为匹配部分,对吗?可能是逗号需要在前瞻和后向断言以及数字中。
    • @Jeremiah:我觉得不错!我绝对比我更喜欢你的解决方案:P 如果 Lukasz 也需要捕获,可以通过一个非常简单的添加来完成:(?&lt;![\d,])(\d{5}(?:,\d{5})*)(?![\d,])(结果:i.imgur.com/8yrdJ.png
    • 我实际上是在用捕获来测试它,但在* 部分没有?:(我只打印$1)。
    【解决方案2】:

    其实我想我明白了! (?&lt;!\d)\d{5}(?!\d)(,(?&lt;!\d)\d{5}(?!\d))*

    我使用了前瞻和后视

    谢谢。

    【讨论】:

      【解决方案3】:

      你可以用这个:

      /\D?\d{5}(?:,\d{5})?\D?/
      

      解释:

      /   : regex delimiter
      \D? : non digit optionnal
      \d{5}   : 5 digits
      (?: : begining of non-capture group
      ,\d{5}  : comma and 5 digits
      )?  : end of group optionnal
      \D? : non digit optionnal
      /   : regex delimiter
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 2022-01-22
        • 1970-01-01
        相关资源
        最近更新 更多