Wie funktioniert der Nicht-Backtracking-Unterausdruck? (? exp)

8

Ich versuche, bei regulären Ausdrücken besser zu werden. Es fällt mir schwer zu verstehen, was (?> expression ) bedeutet. Wo finde ich weitere Informationen zu nicht-backbackenden Subexpressoins? Die Beschreibung des Links DIES lautet:

  

Gieriger Teilausdruck, auch bekannt als nicht-zurückverfolgender Teilausdruck.   Dies wird nur einmal abgeglichen und nimmt dann nicht teil   Rückverfolgung.

dieser andere Link: Ссылка hat auch eine Definition von Nicht-Backtracking Teilausdruck aber ich habe immer noch Schwierigkeiten zu verstehen, was es bedeutet, und ich kann mir kein Beispiel vorstellen, wo ich (?>exp)

verwenden werde     
Tono Nam 24.07.2012, 13:45
quelle

3 Antworten

9

Wie immer ist regular-expressions.info ein guter Anfang.

Verwenden Sie eine Atomgruppe, wenn Sie sicherstellen möchten, dass alles, was einmal gefunden wurde, Teil der Übereinstimmung bleibt.

Um zum Beispiel eine Anzahl von "Wörtern" zu finden, die durch Leerzeichen getrennt sein können oder nicht, gefolgt von einem Doppelpunkt, versuchte ein Benutzer die Regex:

%Vor%

Wenn es ein Match gab, war alles in Ordnung. Aber wenn nicht, würde sein PC aufgrund einer katastrophalen Rückverfolgung nicht mehr mit 100% CPU-Last reagieren, weil die Regex-Engine vergeblich versuchen würde, eine passende Kombination von Wörtern zu finden, die es dem folgenden Doppelpunkt ermöglichen würde. Was natürlich unmöglich war.

Bei Verwendung einer Atomgruppe könnte dies verhindert worden sein:

%Vor%

Nun wird alles, was angepasst wurde, angepasst - kein Backtracking und daher schnelle Ausfallzeiten.

    
Tim Pietzcker 24.07.2012, 13:54
quelle
8

Das Regex Tutorial hat eine Seite hier: Ссылка

Grundsätzlich werden Rückverfolgungsinformationen verworfen, dh a(?>bc|b)c stimmt mit abcc überein, aber nicht abc .

Der Grund dafür, dass es nicht mit der zweiten Zeichenfolge übereinstimmt, ist, dass es eine Übereinstimmung mit bc findet und die Backtracking-Informationen über die Änderung von bc|b verwirft. Es vergisst im Wesentlichen den |b -Teil davon. Daher gibt es keine c nach dem bc und die Übereinstimmung schlägt fehl.

Die nützlichste Methode zur Verwendung von Atomgruppen, wie sie genannt werden, besteht darin, langsame Regexe zu optimieren. Sie können weitere Informationen auf der oben genannten Seite finden.

    
Kendall Frey 24.07.2012 13:54
quelle
1

Lesen Sie Possessiv-Quantoren [a-z]*+ , damit sich die Backtracking-Engine nur an den vorherigen Schritt erinnert, der nicht allen entspricht der vorherigen Schritte, die übereinstimmten.

Dies ist nützlich, wenn viele akzeptable Schritte wahrscheinlich sind und sie Speicher auffressen, wenn jeder Schritt für eine mögliche Backtracking-Regression gespeichert wird.

Possessive Quantoren sind eine Abkürzung für Atomgruppen.

    
Mihai Stancu 24.07.2012 13:55
quelle

Tags und Links