Regular Expressions
Atomische Gruppierung
Suche…
Einführung
Bei regulären, nicht erfassenden Gruppen kann die Engine erneut in die Gruppe eintreten und versuchen, etwas anderes abzugleichen (z. B. eine andere Alternative oder weniger Zeichen, wenn ein Quantifizierer verwendet wird).
Atomare Gruppen unterscheiden sich von regulären Gruppen ohne Capturing darin, dass das Zurückverfolgen verboten ist. Sobald die Gruppe beendet ist, werden alle Backtracking-Informationen verworfen, sodass keine alternativen Übereinstimmungen versucht werden können.
Bemerkungen
Ein Possessiv-Quantifizierer verhält sich wie eine atomare Gruppe, da die Engine keinen Token oder eine Gruppe zurückverfolgen kann.
Die folgenden Funktionen sind äquivalent, auch wenn einige schneller sind als andere:
a*+abc
(?>a*)abc
(?:a+)*+abc
(?:a)*+abc
(?:a*)*+abc
(?:a*)++abc
Gruppieren mit (?>)
Verwenden einer Atomic Group
Atomgruppen haben das Format (?>...)
mit einem ?>
Nach dem geöffneten Paren.
Betrachten Sie den folgenden Beispieltext:
ABC
Der reguläre Ausdruck versucht, an Position 0 des Textes, die vor dem A
in ABC
liegt, zu passen.
Wenn ein Ausdruck verwendet wird, bei dem die Groß- / Kleinschreibung nicht beachtet wird (?>a*)abc
, würde das Zeichen (?>a*)
mit dem Zeichen 1 A
übereinstimmen
BC
als verbleibender Text Die Gruppe (?>a*)
wird beendet, und abc
wird für den verbleibenden Text versucht, der nicht übereinstimmt.
Die Engine kann sich nicht in die Atomgruppe zurückverfolgen, so dass der aktuelle Durchlauf fehlschlägt. Die Engine bewegt sich zur nächsten Position im Text, die sich an Position 1 befinden würde, dh hinter dem A
und vor dem B
von ABC
.
Der Regex (?>a*)abc
wird erneut versucht, und (?>a*)
entspricht 0 mal A
und verlässt den Vorgang
BC
als verbleibender Text Die Gruppe (?>a*)
wird beendet und es wird versucht, abc
auszuführen, was fehlschlägt.
Wieder kann sich die Engine nicht in die Atomgruppe zurückverfolgen, so dass der aktuelle Durchlauf fehlschlägt. Der Regex schlägt weiterhin fehl, bis alle Positionen im Text erschöpft sind.
Verwenden einer nicht-atomaren Gruppe
Regelmäßige, nicht erfassende Gruppen haben das Format (?:...)
mit einem ?:
Nach dem offenen Paren.
Wenn der gleiche Beispieltext verwendet wird, aber stattdessen der Groß- / Kleinschreibung-abhängige Ausdruck (?:a*)abc
verwendet wird, würde eine Übereinstimmung auftreten, da das Zurückverfolgen zulässig ist.
Zuerst wird (?:a*)
den Buchstaben A
im Text verbrauchen
ABC
Verlassen
BC
als verbleibender Text Die Gruppe (?:a*)
wird beendet, und abc
wird für den verbleibenden Text versucht, der nicht übereinstimmt.
Die Engine geht zurück in die Gruppe (?:a*)
und versucht, 1 weniger Zeichen zu finden: Anstatt 1 A
Zeichen zu finden, versucht sie, 0 A
Zeichen zu finden, und die Gruppe (?:a*)
wird beendet. Diese Blätter
ABC
als verbleibender Text Der reguläre Ausdruck abc
ist jetzt in der Lage, den verbleibenden Text erfolgreich abzugleichen.
Anderer Beispieltext
Betrachten Sie diesen Beispieltext mit sowohl atomaren als auch nicht atomaren Gruppen (wiederum ohne Berücksichtigung der Groß- und Kleinschreibung):
AAAABC
Der AAAABC
versucht, an Position 0 des Textes, die vor dem ersten A
in AAAABC
.
Das Muster, das die Atomgruppe (?>a*)abc
, kann nicht übereinstimmen und verhält sich fast identisch mit dem oben genannten atomaren ABC
Beispiel: Alle 4 der A
Zeichen werden zuerst mit (?>a*)
abgeglichen (wobei BC
als verbleibender Text, der abgeglichen werden soll), und abc
nicht mit diesem Text übereinstimmen. Die Gruppe kann nicht erneut eingegeben werden, daher schlägt die Übereinstimmung fehl.
Das Muster, das die nicht-atomare Gruppe (?:a*)abc
, kann übereinstimmen und verhält sich ähnlich wie das nicht-atomare ABC
Beispiel oben: Alle 4 der A
Zeichen werden zuerst mit (?:a*)
abgeglichen BC
als verbleibender Text) und abc
nicht mit diesem Text übereinstimmen. Die Gruppe ist in der Lage neu eingegeben werden, so dass man weniger A
versucht wird: 3 A
- Zeichen werden anstelle von 4 (Abfahrt abgestimmt ABC
als verbleibender Text Übereinstimmen) und abc
in der Lage , auf diesem Text erfolgreich übereinstimmen.