2016-06-13 131 views
0

我有这样的正则表达式验证CC号码:正则表达式验证CC数不验证JCB卡正确

^(?: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

您不必在所有匹配JCB号的一个分支。我为'JCB15 digits'增加了'2100'替代方案:https://regex101.com/r/mV2lN7/1,剩下的就是你需要添加的内容。 –

回答

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

+0

你可以帮助添加'#JCB'丢失吗? – ReynierPM

+0

不,对不起。有数百万个关于cc数字验证的规则。而且消息来源甚至可能相互矛盾。但我会用一个解决方案来更新答案,然后放松那些限制。不知道这是否足够“正确”满足您的需求。 –