2016-05-29 9 views
0

Ich weiß, dass einige CC regex sind:REGEX für Kreditkarte arbeitet nicht mit "oder"

  • Visa: ^4[0-9]{12}(?:[0-9]{3})
  • Mastercard: ^5[1-5][0-9]{14}
  • Amex: ^3[47][0-9]{13}
  • Diners Club: ^3(?:0[0-5]|[68][0-9])[0-9]{11}

Wenn ich sie einzeln versuche, funktionieren sie.
Aber wenn ich

^4[0-9]{12}(?:[0-9]{3}) | ^5[1-5][0-9]{14} | ^3[47][0-9]{13} | ^3(?:0[0-5]|[68][0-9])[0-9]{11} 

tun bekam ich nur false als Rückkehr. Sollte | als OR sein?
BTW, brauchen einen einzigen Regex für alle CC. Ich mache etwas falsch?

+1

Wahrscheinlich die Räume es töten. –

+1

Bist du sicher, dass du auch am Ende kein '$' brauchst? Probieren Sie '^ (?: 4 [0-9] {12} (?: [0-9] {3}) | 5 [1-5] [0-9] {14} | 3 [47] [0- 9] {13} | 3 (?: 0 [0-5] | [68] [0-9]) [0-9] {11}) $ ' –

+1

Sie haben Leerzeichen in Ihren Ausdrücken. Behandelt Ihre regexp-Bibliothek die Leerzeichen nicht als übereinstimmende Zeichen? Wie im vorherigen Kommentar angegeben, müssen Sie den Suchmodus synchronisieren und '^' und '$' verwenden (es kann Anfang/Ende der Zeile oder Anfang/Ende eines vollständigen Textes entsprechen, den Sie an die Übereinstimmungsfunktion der Bibliothek übergeben Einstellungen/Implementierung) – Serge

Antwort

2

Additionaly zu Wiktor Stribiżew Antwort, für Ihre Art von Szenarien eine schöne Art und Weise zu verstehen und regexs zu verbessern ist mit einem Werkzeug wie debuggex.

Also, wenn ich Ihren Ausdruck verwenden, können Sie leicht die Probleme sehen, die Sie haben. Zum Beispiel ist dies der Fall für Ihren Ausdruck:

Regular expression visualization

Wie Sie sehen können, gibt es einige Plätze (gezeigt mit _). Es gibt eindeutig einige Tippfehler.

So können Sie verbessern und Ihre regex beheben, indem Sie mit:

^(?:4[0-9]{15}|5[1-5][0-9]{14}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])‌​[0-9]{11})$ 

Regular expression visualization

+0

Nachdem ich den ersten Teil Ihrer Antwort gelesen hatte, bekam ich den Eindruck, dass '_' einen Benutzerfehler bei debuggex :) anzeigt, während die Leerzeichen auf diese Weise im Diagramm angezeigt werden. –

+0

Ich kannte dieses Werkzeug nicht. Es hilft in der Tat zu visualisieren, wenn etwas nicht stimmt. Die Räume kommen mir nie vor. Danke für die Erklärung und Hilfe! – Antonio

2

Es ist richtig, dass ein Caret ein Anfang einer Zeichenfolge und eine Pipe ein Alternationsoperator ist. Leerzeichen innerhalb sind jedoch nur unbedeutend, wenn ein VERBOSE/comment/freespace Modus aktiviert ist.

Es ist sicherer, diese Räume zu entfernen, und auch das Ende der Linie Ankers hinzufügen ($):

^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])‌​[0-9]{11})$