2016-07-07 29 views
1

Ich habe die folgende Regex entwickelt, die versucht, eine Zeichenfolge mit mindestens einer Ziffer und mindestens einem Kleinbuchstaben zu entsprechen.Warum funktioniert meine Regex nicht, wenn Anfang und Ende von String-Ankern verwendet werden?

(?=.*[a-z])(?=.*\d) 

Dies scheint zu funktionieren OK. Zum Beispiel stimmt es abc3 und nicht abc

Sobald ich jedoch die Regex durch Hinzufügen der Anfang und Ende der String-Anker ändern funktioniert es nicht mehr. Würdest du wissen warum?

^(?=.*[a-z])(?=.*\d)$ 
+2

'$' beendet die Übereinstimmung..basierend testen Sie für einen Kleinbuchstaben, eine Ziffer und eine leere Zeichenfolge zusammen, die nicht möglich ist ..use '^ (? =. * [Az]) (? =. * \ d). * $ '..lookaheads sind von null Breite .. sie verbrauchen keine Zeichen – rock321987

+1

Erklären Sie die obigen Kommentare: die Lookaheads * überprüfen * aber sie tun nicht * verbrauchen * Zeichen. Das einzige, was tatsächlich zusammenpasst, ist '^ $' - eine leere Zeile. Die Lookaheads scheitern, weil nichts "über" das Ende der Kette hinausgehen kann. – usr2564301

Antwort

2

$ beendet die Übereinstimmung hier. Sie testen also grundsätzlich für ein Kleinbuchstabe und eine Ziffer (was in Ordnung ist). Da Lookaheads von null Breite sind, ändert sich die aktuelle Position der Prüfung nicht (, die standardmäßig wegen ^ gestartet wird).

Nach Klein Überprüfung und digit, Sie sind im Grunde mit ^$ regex links der leeren Zeichenkette übereinstimmt (die Position der Anpassung erinnern hat nicht geändert, da die Null-Breite Eigenschaft von Look-Ahead-).

Dies steht im Widerspruch zu Ihren Anforderungen (weil es bereits ein Kleinbuchstabe und eine Ziffer. Kann also String nie leer sein. Dies ist der regex zum Scheitern verurteilt verursacht)

Sie haben

verwenden
^(?=.*[a-z])(?=.*\d).*$