2014-01-07 17 views
5

ich einen regulären Ausdruck der folgenden haben:Regular Expression wiederholendes Muster durch Komma getrennt

.regex(/^(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{4})$/) 

muss genau 4 Zeichen Muss mindestens 1 numerisches und 1 alpha

enthalten Obwohl ich selten regelmäßig tun Ausdruck, das war relativ einfach. Ich habe jetzt eine neue Anforderung, die ich versucht habe zu implementieren, kann aber nicht richtig werden.

Neue Anforderung: Sie können eine kommagetrennte Liste des gleichen Eingabetyps wie zuvor haben. Kann nicht mit einem Komma enden. Jeder Einzelteil muss nach den oben genannten Regeln (4 Zeichen, zumindest auf numerisch, mindestens einen alpha)

Valid: 123F,U6Y7,OOO8 
Invalid: Q2R4, 
Invalid: Q2R4,1234 
Invalid: Q2R4,ABCD 
Invalid: Q2R4,N6 

ich sehr schätze Ihre Hilfe gültig sein! Danke!

+0

Sie können diese Website versuchen - http://txt2re.com/ Es wird Ihnen helfen, den Ausdruck von Grund auf neu zu erstellen. –

Antwort

2

Versuchen Sie, diese Regex (regex test):

.regex(/^(?:(?![0-9]{4}|[a-zA-Z]{4})[a-zA-Z0-9]{4})(?:(?:\b\,)(?![0-9]{4}|[a-zA-Z]{4})[a-zA-Z0-9]{4})*$/) 

Erläuterung:

  • (?:\b\,) -> Spiel mit einem , am Anfang des Strings nur wenn sein vorangestellten eine Wortgrenze

  • (?:(?![0-9]{4}|[a-zA-Z]{4})[a-zA-Z0-9]{4}) -> eine Zeichenkette mit Buchstaben und Ziffern passt nur wenn nicht 4 Stellen haben ow 4 Buchstaben

+2

Fail: '1111,3R4F' – nhahtdh

+0

Danke @nhahtdh, fixed –

+0

Sie könnten es mit einigen W und \ S und \ D-Tags reinigen –

3

Diese Regex funktionieren sollte:

^(?:(?![0-9]*,)(?![a-zA-Z]*,)[a-zA-Z0-9]{4},)*(?![0-9]*$)(?![a-zA-Z]*$)[a-zA-Z0-9]{4}$ 

Oder Sie können [0-9]-\d verkürzen . Es ist jedoch nicht wirklich wichtig, da der erweiterte Code besser lesbar ist.

^(?:(?!\d*,)(?![a-zA-Z]*,)[a-zA-Z\d]{4},)*(?!\d*$)(?![a-zA-Z]*$)[a-zA-Z\d]{4}$ 

können Sie sehen, wie Ihr regex verwandelt diese regex zu machen, wenn ich es die Linie unten wie nach oben:

^ 
(?: 
    (?!\d*,)(?![a-zA-Z]*,)[a-zA-Z\d]{4}, 
)* 
    (?!\d*$)(?![a-zA-Z]*$)[a-zA-Z\d]{4} 
$ 
+0

Cool, sieht gut aus. Netter Job :) –

+0

Vielen Dank soooo viel !! Das funktioniert großartig! – user3006614

1

Ich möchte Highlight der Vorteil meiner Antwort als Vergleich zu anderen Antworten wie folgt:

  • Meine Antwort codiert intuitiv die Anforderung "mindestens ein Alpha" und "mindestens eine Zahl".
    Andere Antworten nutzen die Tatsache, dass unter Berücksichtigung der universellen Menge von [a-zA-Z0-9], die nach ein paar Gedanken, diese beiden Anforderungen in "nicht alle Alpha und nicht alle Ziffern" übersetzen.
  • In meiner Antwort können Sie den universellen Satz auf alles ändern, was Sie wollen (sogar mit einem Komma!), Und müssen die Regex für die anderen Anforderungen nicht ändern.

Meine Antwort:

^(?=.{0,3}\d)(?=.{0,3}[a-zA-Z])[a-zA-Z0-9]{4}(,(?=.{0,3}\d)(?=.{0,3}[a-zA-Z])[a-zA-Z0-9]{4})*$ 

Regular expression visualization

Debuggex Demo

erläutert:

^ 
    (?=.{0,3}\d)(?=.{0,3}[a-zA-Z])[a-zA-Z0-9]{4} # Main part 
    (, 
    (?=.{0,3}\d)(?=.{0,3}[a-zA-Z])[a-zA-Z0-9]{4} 
)* 
$ 

Der "Hauptteil" passt alle vier Zeichen von alphanumerischen Zeichen zusammengesetzt ([a-zA-Z0-9]{4}), mit mindestens einer Ziffer ((?=.{0,3}\d)) und mindestens einem Buchstaben ((?=.{0,3}[a-zA-Z])). Dann wiederhole einfach dieses Muster mit einem Komma.

6

Einige der anderen Antworten wiederholen die Lookahead Assertions. Das ist nicht nötig.

Hier ist ein regulärer Ausdruck, der eine durch Kommata getrennte Sequenz von Atomen entspricht, wobei jedes Atom vier alphanumerische Zeichen ist:

^[A-Z0-9]{4}(?:,[A-Z0-9]{4})*$ 

Natürlich, das ist nicht ganz das, was Sie wollen. Sie wollen keine Atome, die alle alphabetisch sind. Hier ist eine negative Vorschau Behauptung, dass ein solches Atom irgendwo im Text verhindert passend:

(?!.*[A-Z]{4}) 

Und Sie Atome nicht möchten, sind alle numerischen entweder:

(?!.*[0-9]{4}) 

es Putting alles zusammen:

^(?!.*[A-Z]{4})(?!.*[0-9]{4})[A-Z0-9]{4}(?:,[A-Z0-9]{4})*$