我有这个RegEx用于验证CC号码:
^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$
它适用于几乎所有,但它失败了一些。快速浏览一下我做过的测试:
#American Express
370517943574132 -> passed
372714451742486 -> passed
370010255141385 -> passed
341263547614307 -> passed
343874494387669 -> passed
#VISA
4024007125780444 -> passed
4439944519233615 -> passed
4658355677043536 -> passed
4532926168018906 -> passed
4532249806735728 -> passed
#MasterCard
5524097521691644 -> passed
5367170623993901 -> passed
5553103980950937 -> passed
5549194987582424 -> passed
5141794881796756 -> passed
#JCB 15 digits
180078244412845 -> passed
210013400722277 -> not passed
210082510016250 -> not passed
180056142071970 -> passed
210043823226606 -> not passed
#JCB
3158822586903214 -> not passed
3088687202983378 -> not passed
3158899851849561 -> not passed
3096803356450490 -> not passed
3337852908456769 -> not passed
#Dinners Club
30193567772121 -> passed
30131361923813 -> passed
30198560976769 -> passed
30260244203356 -> passed
36297440059376 -> passed
这里的问题在哪里?可以给我一些帮助吗? Here是Regex101的一个例子
答案 0 :(得分:1)
总是让我感到困惑的是人们正在尝试使用正则表达式。使用支持简单if
语句的语言完成后,这样的东西更具可读性和可操作性......
反正。当你看a visualization of the regular expression时,你会注意到有些案例遗漏了:
最后一个案例(应该覆盖输入数据的“#JCB 15位”块)缺少2100
前缀。
要解决此问题,只需将部分2131|1800|35\d{3}
更改为2131|2100|1800|35\d{3}
。
然而,您输入数据的块“#JCB”不受任何正则表达式的覆盖。它完全不见了。
如果将同一部分更改为2131|2100|1800|3\d{4}
,则可以使其工作。不确定这是否“足够正确”。
以下是一个工作示例:https://regex101.com/r/mJ3jW7/1