Problembeschreibung
Link zu diesem Artikel: http://www.hcoding.com/?p=130
Wenn ich zum ersten Mal reguläre Ausdrücke lerne, habe ich zum Beispiel eine Frage: Ich muss die Zeichen zwischen dem ersten Paar „_“ in der Zeichenfolge „_abc_123_“ abgleichen Bei regulären Ausdrücken würde ich „/_w*_/“ schreiben, das passende Ergebnis ist „abc_123“ anstelle von „abc“, wie der Meister sagte ein Fragezeichen, „/_w*?_/“, dann ist das passende Ergebnis „abc“.
Wir wissen es? ' bedeutet bei alleiniger Verwendung: null oder einmal wiederholen, während bei '? ' erscheint nach dem Wiederholungsqualifizierer und hat die Funktion Lazy Matching, d. h. so wenig Zeichen wie möglich abzugleichen. Beschreibung des Lazy-Qualifikators:
Ja, „so wenig Wiederholungen wie möglich“, das ist eine grobe und einfache Erklärung für Lazy Matching.
Wie verstehen Sie also „so wenig Wiederholungen wie möglich“? Wir können es anhand des ignorierten Prioritätsquantifizierers regulärer Ausdrücke erklären.
Prioritätsquantifizierer ignorieren
Die Quantoren „*?“, „?“, „{n,m}?“ und „{n,}?“ sind alle ignorierte Prioritätsquantoren. , Es besteht aus dem Hinzufügen von ? nach * und {}. Wenn dies fehlschlägt, wird zuerst versucht, es nach dem Zurückverfolgen zu versuchen. Wenn beispielsweise „ab??“ mit „abb“ übereinstimmt, wird „a“ anstelle von „ab“ angezeigt. Wenn die Engine erfolgreich mit a übereinstimmt, weil sie die Priorität ignoriert, entscheidet sich die Engine zunächst dafür, nicht mit b übereinzustimmen, und prüft weiterhin den Ausdruck. Wenn sie feststellt, dass der Ausdruck beendet wurde, meldet die Engine direkt, dass die Übereinstimmung erfolgreich war. Konkret erläutern wir anhand des folgenden Beispiels Schritt für Schritt das Funktionsprinzip des Ignorierens von Prioritätsquantoren.
Beispiel
Im obigen Beispiel verwenden Sie „/_w*?_/“, um die Zeichen zwischen dem ersten Paar von „_“ in „_abc_123_“ abzugleichen.
Nachdem mit der Übereinstimmung mit dem ersten „_“ begonnen wurde, entscheidet „w*?“ zunächst, dass keine Übereinstimmung mit Zeichen erforderlich ist, da der Ausdruck „/_w*?“ zu diesem Zeitpunkt ignoriert wird __' in >/' (das '_' nach 'w*?') entspricht dem 'a' in der Zielzeichenfolge '_abc_123_' , Wenn die Übereinstimmung fehlschlägt, wird „w*?“ verwendet, um den nicht übereinstimmenden Zweig auszuprobieren (verwenden Sie w, um a abzugleichen, versuchen Sie, a erfolgreich abzugleichen) Sollten wir im nächsten Schritt versuchen, es zuzuordnen oder zu ignorieren? Da „w*?“ den Prioritätsquantifikator ignoriert und den vorherigen Schritt nicht mit „b“ übereinstimmt, versucht „w*?“ den nicht übereinstimmenden Zweig „ab“. von 3 Malen (Bis das „_“ nach dem Ausdruck „w*?“ mit dem zweiten „_“ der Zielzeichenfolge übereinstimmt), wird „abc“ schließlich abgeglichen.
Prozess (nachdem mit dem Abgleichen des ersten „_“ begonnen wurde):
Das zweite '
_Originalartikel, bitte angeben: JC&hcoding.com
Das Obige stellt mein persönliches Verständnis von regulären Ausdrücken vor – Lazy Matching, einschließlich seiner Aspekte. Ich hoffe, es wird Freunden, die sich für PHP-Tutorials interessieren, hilfreich sein.