【问题标题】:16 digit card number in regex正则表达式中的 16 位卡号
【发布时间】:2020-06-08 04:45:24
【问题描述】:

我被正则表达式函数困住了。开发它以达到现在的水平非常有趣,但我似乎无法进一步改进它,即使使用其他在线示例也是如此。

我有以下正则表达式函数,用于检测 16 位卡号,

(?<=^|[^0-9])[0-9]{16}(?=[^0-9]|$)|[0-9]{4}[-| |_][0-9]{4}[-| |_][0-9]{4}[-| |_][0-9]{4}

此函数检测以下结果,

1) 1234123412341234(共16位)

2) 1234 1234 1234 1234

3) 1234-1234-1234-1234(带有连字符和空格的卡号)

4) Find me 1234-1234-1234-1234 Find me (卡号隐藏在文字中)

我正在努力阻止的是我得到的误报,我知道这是实现上述结果 4 的直接结果。误报超过 16 位,显然不是卡号。例如

1) 1234-1234-1234-1234-1234

当它检测到字符串中的前 16 位数字时,正则表达式会返回该值。我创建了一个过滤掉这些误报的程序,但我认为值得看看是否有人可以改进上述内容,以便其他人可以使用正则表达式功能。由于互联网上的其他示例似乎并没有为我做这项工作。

【问题讨论】:

    标签: regex


    【解决方案1】:

    你可以使用

    (?<!\d)\d{16}(?!\d)|(?<!\d[ _-])(?<!\d)\d{4}(?:[_ -]\d{4}){3}(?![_ -]?\d)
    

    this regex demo

    或者,如果组之间的分隔符必须相同,

    (?<!\d)\d{16}(?!\d)|(?<!\d[ _-])(?<!\d)\d{4}(?=([_ -]))(?:\1\d{4}){3}(?![_ -]?\d)
    

    或者,展开(没有积极的前瞻):

    (?<!\d)\d{16}(?!\d)|(?<!\d[ _-])(?<!\d)\d{4}([_ -])\d{4}(?:\1\d{4}){2}(?![_ -]?\d)
    

    this regex demo

    详情

    • (?&lt;!\d)\d{16}(?!\d) - 十六位数字不包含在任何其他数字中
    • | - 或
    • (?&lt;!\d[ _-])(?&lt;!\d) - 前面没有紧跟数字或数字和空格的位置/_/-
    • \d{4} - 四位数字
    • (?:[_ -]\d{4}){3} - 重复三次 _、空格或 -,然后是任意四位数字
    • (?![_ -]?\d) - 不紧跟可选的_ / 空格或- 后跟数字的位置。

    【讨论】:

    • 有一个不带OR运算符的选项:regex101.com/r/yk0om0/4
    • @JacekRojek 这不一样,可能适用于 OP,也可能不适用于 OP,分隔符可能会丢失并出现在不同的地方。
    【解决方案2】:

    我会将整个正则表达式简化为\s((\d{4}[\s-]?){3}\d{4})\s

    不同之处在于我要求 3 组 4 位数字加上一个可选的分隔符,然后是另一组 4 位数字。那样的话,我肯定总是有 16 个。\s 帮助划分候选人,你可能不需要那个。

    https://regex101.com/上测试

    【讨论】:

      猜你喜欢
      • 2018-11-14
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 2012-03-08
      • 2018-02-15
      相关资源
      最近更新 更多