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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow