用于验证CC号的正则表达式未正确验证JCB卡

时间:2016-06-13 14:20:02

标签: regex validation

我有这个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的一个例子

1 个答案:

答案 0 :(得分:1)

总是让我感到困惑的是人们正在尝试使用正则表达式。使用支持简单if语句的语言完成后,这样的东西更具可读性和可操作性......

反正。当你看a visualization of the regular expression时,你会注意到有些案例遗漏了:

enter image description here

最后一个案例(应该覆盖输入数据的“#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