Heim  >  Artikel  >  Backend-Entwicklung  >  php – PCRE-Wiederholung/Quantifizierer für reguläre Ausdrücke

php – PCRE-Wiederholung/Quantifizierer für reguläre Ausdrücke

伊谢尔伦
伊谢尔伦Original
2016-11-21 17:18:221194Durchsuche

Die Anzahl der

-Wiederholungen wird durch einen Quantifizierer angegeben, der auf die folgenden Elemente folgen kann:

allein, was das maskierte

-Metazeichen sein kann.

Zeichenklasse

Rückverweis (siehe nächster Abschnitt)

Untergruppe (sofern es sich nicht um eine Behauptung handelt)

Allgemeiner Wiederholungsquantifizierer gibt die Anzahl der Übereinstimmungen zwischen an Ein Mindestwert und ein Höchstwert werden definiert, indem zwei Zahlen in geschweifte Klammern eingeschlossen und durch ein Komma getrennt werden. Beide Zahlen müssen kleiner als 65536 sein und die erste Zahl muss kleiner oder gleich der zweiten sein. Beispiel: z{2,4} entspricht „zz“, „zzz“, „zzzz“. Eine einzelne schließende geschweifte Klammer ist kein Sonderzeichen. Wenn die zweite Zahl weggelassen wird, das Komma aber noch vorhanden ist, bedeutet dies, dass es keine Obergrenze gibt. Wenn sowohl die zweite Zahl als auch das Komma weggelassen werden, begrenzt der Quantor eine bestimmte Anzahl von Übereinstimmungen. Beispielsweise stimmt [aeiou]{3,} mit mindestens drei aufeinanderfolgenden Vokalen überein, kann aber auch mit mehr übereinstimmen, während d{8} nur mit 8 Zahlen übereinstimmen kann. Wenn die linke geschweifte Klammer an einer Position erscheint, die die Verwendung von Quantoren nicht zulässt oder nicht mit der Quantorensyntax übereinstimmt, wird sie als gewöhnliches Zeichen betrachtet und selbst im Originaltext gefunden. Beispielsweise ist {,6} kein Quantifizierer und entspricht den vier Zeichen „{,6}“ gemäß dem Originaltext.

Der Quantor {0} ist autorisiert, was dazu führt, dass der vorhergehende Begriff und der Quantor nicht existieren.

Der Einfachheit halber (und zur historischen Kompatibilität) haben die drei am häufigsten verwendeten Quantoren Abkürzungen mit einem Zeichen.

Einzelzeichenquantifikator

* Entspricht {0,}

Entspricht {1,}

? Entspricht {0,1 }

Eine unbegrenzte Endlosschleife kann durch ein Untermuster erstellt werden, das keinem Zeichen entspricht, gefolgt von einem Quantifizierer, der 0 oder mehr Zeichen entspricht. Zum Beispiel: (a?)*

Frühere Versionen von Perl und PCRE erhalten bei der Kompilierung für diesen Modus einen Fehler. Da dies jedoch in manchen Fällen nützlich sein kann, wird dieses Muster jetzt akzeptiert. Wenn jedoch eine Wiederholung des Untermusters mit keinem Zeichen übereinstimmt, wird die Schleife erzwungen.

Standardmäßig sind Quantifizierer „gierig“, d. h. sie stimmen mit so vielen Zeichen wie möglich überein (bis zur maximal zulässigen Anzahl von Übereinstimmungen), ohne dass der Mustervergleich fehlschlägt. Ein klassisches Beispiel für dieses Problem ist der Versuch, Kommentare in C abzugleichen. Alles, was zwischen /* und */ steht, wird als Kommentar betrachtet und einzelne * und / sind in der Mitte von Kommentaren erlaubt. Ein Versuch, C-Kommentare abzugleichen, besteht darin, das Muster /*.**/ zu verwenden. Wenn Sie dieses Muster auf die Zeichenfolge „/* erster Kommentar*/ und nicht auf Kommentar /*zweiter Kommentar*/“ anwenden, wird ebenfalls ein falsches Ergebnis erzielt Es handelt sich um die gesamte Zeichenfolge. Dies liegt an der Gier des Quantifizierers, der versucht, so viele Zeichen wie möglich abzugleichen.

Wenn jedoch auf einen Quantifizierer ein ?-Token (Fragezeichen) folgt, wird der Lazy-Modus (nicht gierig) aktiviert, der nicht mehr so ​​viel wie möglich, sondern so wenig wie möglich übereinstimmt. Das Muster /*.*?*/ funktioniert also beim C-Kommentarabgleich korrekt. Die Bedeutung jedes Quantifizierers selbst ändert sich nicht, aber die Anzahl der bevorzugten Übereinstimmungen ändert sich durch das Hinzufügen von ?. Verwechseln Sie diese Verwendung von ? nicht mit seiner Verwendung als Quantor. Da es zwei Verwendungszwecke hat, verfügt es manchmal über Quantifizierer. Beispielsweise ist d??d eher dazu geneigt, eine Zahl abzugleichen, kann aber gleichzeitig auch den Zweck des gesamten Musterabgleichs erreichen Akzeptieren Sie die Übereinstimmung zweier Zahlen. Anmerkung: Nehmen wir das Muster wd??dw als Beispiel für die Zeichenfolge „a33a“. Obwohl d?? nicht gierig ist, führt die Verwendung von gierig dazu, dass das gesamte Muster nicht übereinstimmt, sodass am Ende immer noch eine Zahl ausgewählt wird Streichhölzer.

Wenn die Option PCRE_UNGREEDY gesetzt ist (eine Option, die in Perl nicht verfügbar ist), dann ist der Quantor standardmäßig nicht gierig. Ein einzelner Quantor kann jedoch gierig gemacht werden, indem ihm ein ? folgt. Mit anderen Worten: Die Option PCRE_UNGREEDY kehrt das gierige Standardverhalten um.

Der Quantor gefolgt von einem „ “ bedeutet „Besitz“. Es frisst so viele Zeichen wie möglich und achtet nicht auf andere Muster dahinter. Beispielsweise stimmt .*abc mit „aabc“ überein, aber .* abc stimmt nicht überein, da .* die gesamte Zeichenfolge frisst, was dazu führt Das verbleibende Muster stimmt nicht überein. Seit PHP 4.3.3 können Sie den Possessor ( ) verwenden, um Quantoren zu ändern und so die Geschwindigkeit zu verbessern.

Wenn eine Untergruppe durch einen Quantifizierer mit einer Mindestzahl größer als 1 oder einem Höchstzahllimit geändert wird, ist für den Kompilierungsmodus proportional zur Mindest- oder Höchstzahl mehr Speicher erforderlich.

Wenn ein Muster mit .* oder .{0,} beginnt und die Option PCRE_DOTALL aktiviert ist (entspricht Perls /s), die die Übereinstimmung mit Zeilenumbrüchen ermöglicht, wird das Muster implizit befestigt, denn egal wie Auf diese Weise wird jede Zeichenposition in der Zielzeichenfolge als nächstes ausprobiert, sodass es nach dem ersten Mal nie einen Punkt gibt, an dem alle Übereinstimmungen erneut versucht werden. PCRE behandelt dieses Muster genauso wie A. Um diese Optimierung zu erhalten, wenn das Muster mit .* beginnt und wir wissen, dass die Zielzeichenfolge keinen Zeilenumbruch enthält, lohnt es sich, PCRE_DOTALL festzulegen oder alternativ den Anker explizit mit ^ anzugeben.

Anmerkung: Die Optimierung hier bedeutet, dass nach einer Nichtübereinstimmung des Musters nicht nach der nächsten Position gesucht wird, wenn beispielsweise PCRE_DOTALL nicht festgelegt ist und das erste Zeichen der Zielzeichenfolge ein ist Wenn ein Zeilenumbruchzeichen vorliegt, versucht das Muster das erste Zeichen. Wenn eine Nichtübereinstimmung festgestellt wird, wird das Muster ab der zweiten Zeichenposition erneut versucht. Nach der Verwendung von PCRE_DOTALL wird es definitiv übereinstimmen ... Ebenso besteht bei Verwendung von ^ oder /A die Einschränkung darin, dass Sie, sobald das Muster nicht übereinstimmt, direkt beenden können, ohne das gesamte Muster an der nächsten Position der Zielzeichenfolge erneut zu beginnen. übereinstimmen.

Wenn eine erfasste Untergruppe wiederholt wird, ist das Ergebnis der erfassten Untergruppe der in der letzten Iteration erfasste Wert. Beispielsweise stimmt (tweedle[dume]{3}s*) mit der Zeichenfolge „tweedledum tweedledee“ überein und das erhaltene Ergebnis der Untergruppenerfassung ist „tweedledee“. Bei verschachtelten Capture-Untergruppen können die entsprechenden Capture-Werte jedoch in früheren Iterationen festgelegt werden. Beispielsweise entspricht /(a|(b)) / der Zeichenfolge „aba“, und das Ergebnis der zweiten erfassten Untergruppe ist „b“. Anmerkung des Übersetzers: Wenn Sie den Teil nach „jedoch“ nicht verstehen, verwenden wir ein Beispiel, um zu veranschaulichen, dass b das zuletzt erfasste Ergebnis der zweiten Untergruppe ist, sodass das Endergebnis der zweiten Untergruppe b ist, was mit übereinstimmt die vor „jedoch“ beschriebenen Regeln.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn