2016-06-13 2 views
0

Ich habe dieses RegEx für validate CC-Nummern:Regex für validate CC-Nummer ist nicht JCB Validieren Karten richtig

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

Es ist für fast alle funktioniert, aber es nicht für ein paar Einsen. Werfen Sie einen Blick auf diesen Test, den ich gemacht habe:

#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 

Wo ist das Problem hier? Kann mir jemand Hilfe geben? Here ist ein Beispiel bei Regex101

+0

Sie haben keine Niederlassung für passende JCB Zahlen überhaupt. Ich habe eine "2100" Alternative für die "JCB15 Ziffern" hinzugefügt: https://regex101.com/r/mV2lN7/1, der Rest ist was Sie hinzufügen müssen. –

Antwort

1

Es verwirrt mich immer, was Leute mit Regex zu tun versuchen. Zeug wie dieses ist viel lesbarer und aufrechterhaltbar, wenn es mit einer Sprache getan wird, die einfache if Aussagen unterstützt ...

Anyway. Wenn Sie an a visualization of the regular expression schauen, werden Sie feststellen, dass einige Fälle fehlen nur:

enter image description here

Der letzte Fall (sollte den „#JCB 15 Stellen“ Block Ihrer Eingangsdaten decken) fehlen den 2100 Präfix.

Um dies zu beheben, ändern Sie einfach das Teil 2131|1800|35\d{3} zu 2131|2100|1800|35\d{3}.

Der Block "#JCB" Ihrer Eingabedaten wird jedoch von keinem Fall Ihrer Regex abgedeckt. Es fehlt einfach komplett.

Sie können dies tun, wenn Sie das gleiche Teil zu 2131|2100|1800|3\d{4} ändern. Nicht sicher, ob das "richtig genug" ist.

Hier ist ein funktionierendes Beispiel: https://regex101.com/r/mJ3jW7/1

+0

Kannst du dazu beitragen, dass '# JCB' fehlt? – ReynierPM

+0

Nein, tut mir leid. Es gibt wie Millionen verschiedene Regeln in Bezug auf CC-Nummer Validierung. Und Quellen könnten sich sogar widersprechen. Aber ich werde die Antwort mit einem Fix aktualisieren, der dann die Einschränkungen lockert. Keine Ahnung, ob das für Ihre Bedürfnisse "richtig genug" ist. –