正规用于发现信用卡

Ash*_*ame 10 regex

我已经阅读了这个问题,但对于Discover卡,起始数字6011, 622126-622925, 644-649, 65不仅仅是6011, 65.(来源)

对于Discover卡,我从这个问题中选择了这个正则表达式 ^6(?:011|5[0-9]{2})[0-9]{12}$

我修改它来掩盖6011,644-649&65但是622126-622925,建筑的正则表达式是很难的Cuz我可怜的正则表达式的技能.

到目前为止我有这个正则表达式6(?:011|5[0-9]{2}|[4][4-9][0-9]|[2]{2}[1-9])[0-9]{2}$,但它只检查622[1-9]**.

如何修改它,使它只接受之间622126-622925622***情况?

Nul*_*ion 13

这是你的正则表达式(演示):

^6(?:011\d{12}|5\d{14}|4[4-9]\d{13}|22(?:1(?:2[6-9]|[3-9]\d)|[2-8]\d{2}|9(?:[01]\d|2[0-5]))\d{10})$
Run Code Online (Sandbox Code Playgroud)

毋庸置疑,我不会完全称之为漂亮或易于维护.我建议将数字解析为整数,并使用您的编程语言进行检查.

您还应该使用Luhn算法来检查信用卡号是否有效,虽然理论上可以使用正则表达式执行此操作,但它会比这更糟糕.


请允许我告诉你我是如何一步一步地到达这个怪物的.首先,以下是您如何匹配这些范围:

6011        # matches 6011
65          # matches 65
64[4-9]     # matches 644-649
622(1(2[6-9]|[3-9]\d)|[2-8]\d{2}|9([01]\d|2[0-5]))  
            # matches 622126-622925
Run Code Online (Sandbox Code Playgroud)

现在,您想要匹配其余数字:

6011\d{12}        # matches 6011 + 12 digits
65\d{14}          # matches 65 + 14 digits
64[4-9]\d{13}     # matches 644-649 + 13 digits
622(1(2[6-9]|[3-9]\d)|[2-8]\d{2}|9([01]\d|2[0-5]))\d{10}
                  # matches 622126-622925 + 10 digits
Run Code Online (Sandbox Code Playgroud)

现在,您可以组合所有四个,并添加行锚的开始和结束:

^(                  # match start of string and open group
 6011\d{12}|        # matches 6011 + 12 digits
 65\d{14}|          # matches 65 + 14 digits
 64[4-9]\d{13}|     # matches 644-649 + 13 digits
 622(1(2[6-9]|[3-9]\d)|[2-8]\d{2}|9([01]\d|2[0-5]))\d{10}
                    # matches 622126-622925 + 10 digits
)$                  # close group and match end of string
Run Code Online (Sandbox Code Playgroud)

上面的最终产品是前一个正则表达式的略微压缩版本,我还使组不捕获(这就是它们?:的用途).

  • 我修改了此正则表达式,将 16 位数字限制增加到 19 位数字: /^6(?:011\d{12,15}|5\d{14,17}|4[4-9]\d{13,16 }|22(?:1(?:2[6-9]|[3-9]\d)|[2-8]\d{2}|9(?:[01]\d|2[0 -5]))\d{10,13})$/ 此维基百科页面列出了 16 - 19 位数字的范围: https://en.wikipedia.org/wiki/Payment_card_number 此页面有包含 16 和 19 的 Discover 测试卡数字:https://www.freeformatter.com/credit-card-number-generator-validator.html (2认同)