2017-01-24 5 views
1

Ich versuche, herauszufinden, wie die folgenden Regeln entsprechen ...Genaue Anzahl von Zeichen mit führenden Leerzeichen

  • Genau 4 Zeichen (alphanumerische) oder Null-Zeichen
  • Zeichen können Leerzeichen, wenn nur verwendet auf Pad auf der linken
  • enthalten, können nicht nur 4 Räume

Beispiel akzeptabler Begegnungen:

"" 
" 43" 
" D42" 

Beispiel für nicht-akzeptablen Spielen:

"1 A3" 
"1 " 
" " 
"A 1 " 

Ich habe versucht, die folgende regex aber es funktioniert einfach nicht die erwarteten Ergebnisse.

(([\s]*[0-9A-Z]*){4}|) 
+0

wählen Wäre dies trivialerweise nicht leicht mit einer einfachen Schleife anstatt Regex? –

+0

Probieren Sie ['^ (?!. {5} | + $) * [a-zA-Z0-9] * $'] (https://regex101.com/r/LBv1rY/1) –

+0

@ JonathanWood hehe das ist Was ich dachte, aber ich habe mein Bestes versucht, Regex zu verwenden, um es zu lernen. Ich weiß, dass es stark ist und ich möchte gut damit umgehen, aber normalerweise nehme ich den einfachen Weg (ohne es gut zu wissen) heraus und benutze Code, um zu versuchen, meine Aufgabe zu erfüllen. ;) –

Antwort

4

Regex ist nicht sehr gut über das Zählen, aber wenn die Zahl niedrig ist, wie vier ist, können Sie eine einfache, sich wiederholende regex erstellen, die die Arbeit erledigt:

^(|[0-9A-Z]{4}| {1}[0-9A-Z]{3}| {2}[0-9A-Z]{2}| {3}[0-9A-Z]{1})$ 

Diese Regex listet eine leere string, zusammen mit vier akzeptablen Verwendungen des Raumes:

  • Kein Platz, vier Zeichen
  • Ein Raum, drei Zeichen
  • Zwei Räume, zwei Zeichen
  • Drei Räume, ein Zeichen

Demo.

+1

Es ist strittig, aber einige Leute können es leichter finden, mit expliziten Quantifizierern für die Leerzeichen zu lesen: '^ (| [0-9A-Z] {4} | [0-9A-Z] {3} | {2} [ 0-9A-Z] {2} | {3} [0-9A-Z]) $ 'oder sogar'^(| [0-9A-Z] {4} | {1} [0-9A-Z] {3} | {2} [0-9A-Z] {2} | {3} [0-9A-Z]) $ '. Natürlich ist der Versuch, eine Regex lesbar zu machen, sowieso ein bisschen ein Idiot, also wären Code-Kommentare vielleicht besser! –

+0

@MattBurland Ich mag das eigentlich besser. Es hilft, die Speicherplatzanzahl nicht zu vermasseln. –

+0

@MattBurland Einverstanden, Leerzeichen sind schwer zu zählen, daher ist die explizite Angabe der Anzahl eine gute Idee. Vielen Dank! – dasblinkenlight

1

Gemäß der Frage des OP, die alphanumerische Zeichen übereinstimmen fragt, passen die akzeptierte Antwort nicht Klein a-z, wenn sie nicht angeben RegexOptions.IgnoreCase.

so die richtige Lösung sollte diese Option zu übergeben, wählt

^(|[\w]{4}| {1}[\w]{3}| {2}[\w]{2}| {3}[\w]{1})$ 

oder alternativ

^(|[0-9A-Za-z]{4}| {1}[0-9A-Za-z]{3}| {2}[0-9A-Za-z]{2}| {3}[0-9A-Za-z]{1})$ 
+0

Danke für die zusätzliche Lösung Pawan. Ich brauchte es eigentlich nur für Großbuchstaben. Ich habe es in den Anforderungen nicht erwähnt, aber es war offensichtlich in meinem Regex-Versuch. ;) –

Verwandte Themen