我已读完这个问题,但对于 Discover 卡,起始数字是6011, 622126-622925, 644-649, 65
而不仅仅是6011, 65
. (Source)
对于发现卡,我从该问题中选择了这个正则表达式^6(?:011|5[0-9]{2})[0-9]{12}$
我修改它来覆盖6011
, 644-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
for 622***
case?
这是你的正则表达式(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})$
不用说,我不会说这很漂亮或易于维护。我建议将数字解析为整数并使用您的编程语言进行检查。
您还应该使用卢恩算法检查信用卡号码是否有效,同时您可以理论上用正则表达式来做这件事,它会比这糟糕很多倍。
请允许我向你展示我是如何一步步走向这个怪物的。首先,以下是匹配每个范围的方法:
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
上面的最终产品是之前的正则表达式的稍微压缩的版本,我还制作了非捕获组(这就是那些?:
是给)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)