正则表达式发现信用卡

我曾经使用过此问题读,但发现卡,起始位是6011, 622126-622925, 644-649, 65 ,而不是仅仅6011, 65 。 (资源)

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

我修改了它涵盖6011644-64965 ,但为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-622925之间的622***箱子?


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

^6(?:011d{12}|5d{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})$

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

你也应该使用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

现在,你想匹配其余的数字:

6011d{12}        # matches 6011 + 12 digits
65d{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

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

^(                  # match start of string and open group
 6011d{12}|        # matches 6011 + 12 digits
 65d{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

上面的最终产品是前一个正则表达式的稍微压缩版本,并且我还让团队不捕获(这就是那些?:所针对的)。


这里是你的选择:

  • 通过它破解你的方式,并构建一个非常复杂的正则表达式。 正则表达式不适合这种整数比较,所以你想出的东西必然会很长,不复杂和不可维护。 请参阅正则表达式以查看数值以下的值以及与此主题类似的SO问题。
  • 在你的代码中使用整数比较。
  • 作为参考一个这样复杂的正则表达式会是

    62212[6-9]|6221[3-9]|622[1-8]|62291|62292[1-5]


    即使这张票是3年前,我遇到了同样的任务,并希望分享一个正则表达式为622126-622925 :)

    ^(622[1-9]d(?<!10|11|9[3-9])d(?<!12[0-5]|92[6-9])d{10})$
    

    其中使用零宽度负向倒序排除不期望的数字

    链接地址: http://www.djcxy.com/p/70705.html

    上一篇: Regex for Discover credit card

    下一篇: Check if card is VISA or VISAElectron