正则表达式发现信用卡
我曾经使用过此问题读,但发现卡,起始位是6011, 622126-622925, 644-649, 65
,而不是仅仅6011, 65
。 (资源)
对于发现卡片,我从这个问题中拿出了这个正则表达式^6(?:011|5[0-9]{2})[0-9]{12}$
我修改了它涵盖6011
, 644-649
和65
,但为622126-622925
,构建正则表达式是硬的Cuz我可怜的正则表达式的技能。
我有这个正则表达式到目前为止6(?:011|5[0-9]{2}|[4][4-9][0-9]|[2]{2}[1-9])[0-9]{2}$
,但它只检查622[1-9]**
。
我如何修改它,以便它只接受622126-622925
之间的622***
箱子?
这是你的正则表达式(demo):
^6(?:011d{12}|5d{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
现在,你想匹配其余的数字:
6011d{12} # matches 6011 + 12 digits
65d{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
6011d{12}| # matches 6011 + 12 digits
65d{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
上面的最终产品是前一个正则表达式的稍微压缩版本,并且我还让团队不捕获(这就是那些?:
所针对的)。
这里是你的选择:
作为参考一个这样复杂的正则表达式会是
62212[6-9]|6221[3-9]|622[1-8]|62291|62292[1-5]
即使这张票是3年前,我遇到了同样的任务,并希望分享一个正则表达式为622126-622925 :)
^(622[1-9]d(?<!10|11|9[3-9])d(?<!12[0-5]|92[6-9])d{10})$
其中使用零宽度负向倒序排除不期望的数字
链接地址: http://www.djcxy.com/p/70705.html