正规用于发现信用卡

时间:2012-11-21 19:27:41

标签: regex

我已阅读this question,但对于发现卡,起始数字为6011, 622126-622925, 644-649, 65,而不仅仅是6011, 65。 (Source

对于Discover卡,我从问题^6(?:011|5[0-9]{2})[0-9]{12}$

中选择了这个正则表达式

我将其修改为涵盖6011644-649& 65但对于622126-622925而言,建立正则表达式对我的正则表达能力很差很难。

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

如何对其进行修改,使其仅622126-622925 622*** {{1}}之间的接受?

3 个答案:

答案 0 :(得分:13)

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

^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})$

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

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


请允许我一步一步向您展示我是如何到达这个怪物的。首先,以下是您如何匹配这些范围:

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

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

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

现在你可以将所有四个组合起来,并添加行锚的起点和终点:

^(                  # 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

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

答案 1 :(得分:0)

以下是您的选择:

  1. 通过它破解并构建一个非常复杂的正则表达式。正则表达式不适合这种整数比较,所以你想出来的必然是长的,简单的和不可维护的。有关此主题,请参阅Regex for number check below a value和类似的SO问题。
  2. 在代码中使用整数比较。
  3. 作为参考,一个这样的复杂正则表达式将是

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

答案 2 :(得分:0)

即使这张票是3年前,我遇到了同样的任务,想分享622126-622925的正则表达方式:)

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

使用零宽度负向lookbehind来排除不期望的数字