2010-09-26 18 views
9

Ich habe ein Problem mit Lookahead Assertion (? =). Zum Beispiel habe ich Ausdruck:Regex - Lookahead Assertion

/Win(?=2000)/ 

Es paßt Win, wenn Ausdruck wie Win2000 ist, Win2000fgF. Ich habe nächste Ausdruck:

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

Es ist für Ziffern- und Kleinbuchstaben entsprechen, zum Beispiel: 45dF, 4Dd. Aber ich weiß nicht, warum es funktioniert und alle Zeichen übereinstimmen :) Ich habe keine Zeichen, die vor (?=.*\d) sind. Ich denke, nur sollte dieser Ausdruck arbeiten:

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

(mit \* vor Ausdruck).

Können Sie es erklären?

Antwort

38

Sagen wir, wir sind die Regex-Engine und wenden die Regex ^(?=.*\d)(?=.*[a-z]).*$ auf die Zeichenfolge 2a an.

beginnend an Position 0 (vor dem ersten Zeichen):

  1. ^: Stellen Sie sicher, dass wir am Anfang des Strings sind: OK
  2. (?=: Lassen Sie uns prüfen, ob die folgende regex passen könnte. ..
  3. .*: mit einer beliebigen Anzahl von Zeichen übereinstimmen ->2a. OK.
  4. \d: Nein, wir sind schon am Ende. Lassen Sie uns ein Zeichen zurückgehen: a -> Nein, stimmt nicht überein. Geh zurück zu einem anderen: 2 -> MATCH!
  5. ): Ende der Vorausschau, Übereinstimmung erfolgreich. Wir sind immer noch auf Position 0!
  6. (?=: Lassen Sie uns prüfen, ob die folgende regex ... passen könnte
  7. .*: eine beliebige Anzahl von Zeichen übereinstimmen ->2a. OK.
  8. [a-z]: Nein, wir sind schon am Ende. Lass uns einen Charakter zurückgehen: a -> MATCH!
  9. ): Ende der Vorausschau, Übereinstimmung erfolgreich. Wir sind immer noch auf Position 0!
  10. .*: passen Sie eine beliebige Anzahl von Zeichen ->2a -> MATCH!
  11. $: Mal sehen - sind wir am Ende der Zeichenfolge? Ja wir sind! -> Übereinstimmung!
  12. Hey, wir haben das Ende der Regex erreicht. Groß. Spiel abgeschlossen!
+0

Danke für großartige Erklärung. Können Sie mir sagen, warum^(? =. * \ D) (? =. * [A-z]) $ (ohne. * Am Ende) nicht für 2a funktioniert? Dieser Regex sollte übereinstimmen? – luk4443

+4

Nun, stellen Sie sich vor, Sie lassen Schritt 10 aus - die Regex-Engine ist immer noch auf Position 0, so dass es nicht mit dem "$" übereinstimmt. –

+0

Ok, danke :) – luk4443

3

Lookaheads stimmen nicht überein, behaupten sie.

Dies bedeutet, dass wenn Sie ein Lookahead verwenden, Sie brauchen etwas, wird übereinstimmen, was Sie wollen, wenn Sie weiter gehen wollen.