Regex for Discover credit card
Regex for Discover credit card
我已经阅读了这个问题,但是对于Discover卡而言,起始数字是 6011、622126-622925、644-649、65
,而不是只有6011、65
。(来源)
对于Discover卡,我从那个问题中选了这个正则表达式 ^6(?:011|5[0-9]{2})[0-9]{12}$
我将它修改为涵盖6011
、644-699
和 65
,但对于 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日
以下是你的选项:
- 试着通过构建一个非常复杂的正则表达式来解决问题。正则表达式并不适用于这种类型的整数比较,因此你得到的必将是长而复杂难以维护的。可以看看这个话题下的正则表达式以及类似的stackoverflow上的问题。
- 在你的代码中使用整数比较。
作为参考,一个这样复杂的正则表达式可能是:
62212[6-9]|6221[3-9]|622[1-8]|62291|62292[1-5]
这是您的正则表达式(演示):
^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
上面的最终产品是先前正则表达式的稍微压缩的版本,我还使组没有捕获(这就是那些?:
的用途)。