我已经读过this question了,但是Discover卡的起始数字是6011, 622126-622925, 644-649, 65,而不仅仅是6011, 65。(Source)
对于Discover卡,我从问题^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]**。
如何修改它,使其只接受用于622***的622126-622925之间的大小写?
发布于 2012-11-22 03:44:59
这是您的正则表达式(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上面的最终产品是前一个正则表达式的略微压缩的版本,并且我还将组设为非捕获(这就是那些?:的用途)。
发布于 2012-11-22 03:36:00
以下是您的选择:
作为参考,一个这样的复杂正则表达式将是
62212[6-9]|6221[3-9]|622[1-8]|62291|62292[1-5]
发布于 2016-06-30 16:47:52
即使这张票是3年前的,我也遇到了同样的任务,我想分享一个622126-622925的正则表达式:)
^(622[1-9]\\d(?<!10|11|9[3-9])\\d(?<!12[0-5]|92[6-9])\\d{10})$它使用零宽度负回溯来排除不期望的数字
https://stackoverflow.com/questions/13500648
复制相似问题