Regex for Discover credit card

30 浏览
0 Comments

Regex for Discover credit card

我已经阅读了这个问题,但是对于Discover卡而言,起始数字是 6011、622126-622925、644-649、65,而不是只有6011、65。(来源

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

我将它修改为涵盖6011644-69965,但对于 622126-622925,由于我的糟糕的正则表达式技能,建立正则表达式非常困难。

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

我应该如何修改它以便在 622*** 的情况下仅接受 622126-622925之间的数字?

admin 更改状态以发布 2023年5月24日
0
0 Comments

以下是你的选项:

  1. 试着通过构建一个非常复杂的正则表达式来解决问题。正则表达式并不适用于这种类型的整数比较,因此你得到的必将是长而复杂难以维护的。可以看看这个话题下的正则表达式以及类似的stackoverflow上的问题。
  2. 在你的代码中使用整数比较。

作为参考,一个这样复杂的正则表达式可能是:

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

0
0 Comments

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

^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算法来检查信用卡号码是否有效,虽然您理论上可以使用正则表达式来做到这一点,但它比这个糟糕得多。


让我逐步展示我是如何得到这个怪物的。首先,这是如何匹配每个范围的:

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

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

0