423 Stimmen

Gierige vs. Zögerliche vs. Besitzergreifende Qualifikatoren

Ich fand dies Lehrgang über reguläre Ausdrücke, und obwohl ich intuitiv verstehe, was die Qualifikatoren "gierig", "zurückhaltend" und "besitzergreifend" bewirken, scheint es eine ernsthafte Lücke in meinem Verständnis zu geben.

Konkret im folgenden Beispiel:

Enter your regex: .*foo // Greedy qualifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.

Enter your regex: .*?foo // Reluctant qualifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfoo" starting at index 0 and ending at index 4.
I found the text "xxxxxxfoo" starting at index 4 and ending at index 13.

Enter your regex: .*+foo // Possessive qualifier
Enter input string to search: xfooxxxxxxfoo
No match found.

In der Erklärung heißt es Essen die gesamte eingegebene Zeichenkette, Buchstaben wurden verbraucht , Matcher zurückdrehend wurde das äußerste rechte Vorkommen von "foo" Erbrochenes , usw.

Leider verstehe ich trotz der schönen Metaphern immer noch nicht, was von wem gegessen wird... Kennen Sie eine andere Anleitung, die (kurz und bündig) erklärt wie Reguläre Ausdrücke funktionieren?

Wenn jemand den folgenden Absatz in einer etwas anderen Formulierung erklären kann, wäre das sehr hilfreich:

Das erste Beispiel verwendet den gierigen Quantifizierer .* um "irgendetwas" zu finden, null oder mehr Mal, gefolgt von den Buchstaben "f" , "o" , "o" . Da der Quantifizierer gierig ist, ist die .* Teil des Ausdrucks frisst zunächst die gesamte Eingabezeichenfolge. An diesem Punkt kann der Gesamtausdruck nicht erfolgreich sein, weil die letzten drei Buchstaben ( "f" , "o" , "o" ) sind bereits verbraucht worden [von wem?]. Also zieht sich der Matcher langsam [von rechts nach links?] einen Buchstaben nach dem anderen zurück, bis das äußerste rechte Vorkommen von "foo" erbrochen wurde [was bedeutet das?], woraufhin die Suche erfolgreich ist und die Suche endet.

Das zweite Beispiel ist jedoch widerwillig und beginnt damit, dass zunächst [von wem?] "nichts" konsumiert wird. Denn "foo" nicht am Anfang der Zeichenkette steht, ist es gezwungen, den ersten Buchstaben zu verschlucken [wer verschluckt? "x" ), was die erste Übereinstimmung bei 0 und 4 auslöst. Unser Test-Kabelbaum setzt den Prozess fort, bis die Eingabezeichenkette erschöpft ist. Es findet eine weitere Übereinstimmung bei 4 und 13.

Im dritten Beispiel wird keine Übereinstimmung gefunden, weil der Quantor ein Possessivum ist. In diesem Fall wird die gesamte Eingabezeichenkette von .*+ [wie?], so dass nichts übrig bleibt, um das "foo" am Ende des Ausdrucks zu erfüllen. Verwenden Sie einen Possessiv-Quantifizierer für Situationen, in denen Sie alles von etwas erfassen wollen, ohne jemals einen Rückzieher zu machen [was bedeutet Rückzieher?]; er wird den entsprechenden Gier-Quantifizierer in Fällen, in denen die Übereinstimmung nicht sofort gefunden wird, übertreffen.

2voto

Tilo Koerbs Punkte 29

Gierig: "die längste mögliche Folge von Zeichen abgleichen".

Reluctant: "die kürzest mögliche Zeichenfolge".

Besitzergreifend: Dies ist etwas seltsam, da (im Gegensatz zu greedy und reluctant) NICHT versucht wird, eine Übereinstimmung für die gesamte Regex zu finden.

Im Übrigen: Keine Regex-Pattern-Matcher-Implementierung wird jemals Backtracking verwenden. Alle realen Pattern Matcher sind extrem schnell - fast unabhängig von der Komplexität des regulären Ausdrucks!

0voto

Gierige Quantifizierung beinhaltet den Musterabgleich unter Verwendung aller verbleibenden nicht überprüften Zeichen einer Zeichenkette während einer Iteration. Ungültige Zeichen beginnen in der aktive Sequenz . Jedes Mal, wenn eine Übereinstimmung nicht zustande kommt, wird das Zeichen am Ende unter Quarantäne gestellt und die Prüfung wird erneut durchgeführt.

Wenn nur die führenden Bedingungen des Regex-Musters von der aktiven Sequenz erfüllt werden, wird versucht, die verbleibenden Bedingungen anhand der Quarantäne zu überprüfen. Wenn diese Überprüfung erfolgreich ist, werden die übereinstimmenden Zeichen in der Quarantäne überprüft. Die restlichen nicht übereinstimmenden Zeichen bleiben unüberprüft und werden verwendet, wenn der Prozess in der nächsten Iteration von neuem beginnt.

Der Zeichenfluss erfolgt von der aktiven Sequenz in die Quarantäne. Das Ergebnis ist, dass so viel wie möglich von der ursprünglichen Sequenz in einen Treffer einbezogen wird.

Zurückhaltende Quantifizierung ist größtenteils dasselbe wie die gierige Qualifizierung, außer dass der Fluss der Zeichen umgekehrt ist, d. h. sie beginnen in der Quarantäne und fließen in die aktive Sequenz . Das Ergebnis ist, dass so wenig wie möglich von der ursprünglichen Sequenz in eine Übereinstimmung einbezogen wird.

Possessive Quantifizierung nicht über eine Quarantäne und beinhaltet alles in einem festen aktive Sequenz .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X