Gierig vs. Zurückhaltend vs. Possessive Quantoren

Fand ich diese Super tutorial auf reguläre Ausdrücke und während ich intuitiv verstehen, was "gierig", "zurückhaltend" und "besitzergreifend" Quantoren tun, scheint es eine ernsthafte Lücke in meinem Verständnis.

Insbesondere im folgenden Beispiel:

Enter your regex: .*foo  //greedy quantifier
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 quantifier
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 quantifier
Enter input string to search: xfooxxxxxxfoo
No match found.

Der Erklärung erwähnt Essen die gesamte Eingabe-Zeichenfolge, die Buchstaben wurden verbraucht, matcher Rückendeckung aus, am weitesten rechts liegenden vorkommen von "foo" wurde wiedergekäut, etc.

Leider, trotz der schönen Metaphern, ich verstehe immer noch nicht, was gegessen wird, von wem... kennen Sie ein tutorial, das erklärt (kurz und prägnant) wie reguläre Ausdrücke Motoren arbeiten?

Alternativ, wenn jemand erklären kann, in etwas unterschiedlichen Formulierungen der folgende Absatz, das wäre sehr geschätzt:

Das erste Beispiel verwendet den gierigen
Quantifizierer .* Sie finden "alles", null
oder mehrmals, gefolgt von den Buchstaben
"f" "o" "o". Da der Quantifizierer ist
gierig, die .* Teil des
Ausdruck zuerst isst die gesamte Eingabe
string. An dieser Stelle, die insgesamt
Ausdruck kann nicht gelingen, weil die
letzten drei Buchstaben ("f" "o" "o")
die bereits verbraucht wurde (von wem?). Damit der matcher
langsam Rücken (von rechts nach Links?) ein Brief zu einem Zeitpunkt,
bis die am weitesten rechts liegenden vorkommen von
"foo" wurde regurgitated (was bedeutet das?), an die
Punkt das match gelingt und die
Suche endet.

Dem zweiten Beispiel, jedoch ist
nur ungern, so dass es beginnt mit dem ersten
verbraucht wird (von wem?) "nichts". Weil "foo"
nicht erscheinen am Anfang der
string, es ist gezwungen zu schlucken (wer schluckt?) die
ersten Buchstaben (ein "x"), die Auslöser
das erste Spiel bei 0 und 4. Unser test
Kabelbaum wird der Prozess fortgesetzt, bis
der input-string ist erschöpft. Es
findet ein weiteres Spiel bei 4 und 13.

Dritten Beispiel nicht zu finden
Spiel, weil die Quantifizierer ist
besitzergreifend. In diesem Fall wird die gesamte
input-string ist verbraucht .*+, (wie?)
es blieb nichts übrig, um zu befriedigen
"foo" am Ende der
Ausdruck. Verwenden Sie ein besitzergreifend
Quantifizierer für Situationen, in denen Sie
ergreifen wollen alle etwas, ohne
je Schutzfolie (was bedeutet wieder aus bedeuten?); es wird übertreffen
das entspricht gierigen Quantifizierer im
Fälle, in denen das Spiel nicht
sofort fand.

Maximale Quantoren wie *, +, und ? sind gierig. Minimal Quantoren wie *?, +?, und ?? sind faul. Besitzergreifend Quantoren wie *+, ++, und ?+ sind klebrig.
Diese Frage wurde Hinzugefügt, um den Stapel-Überlauf Regulären Ausdruck FAQ, unter "Quantoren > Mehr auf die Unterschiede...".

InformationsquelleAutor Regex Rookie | 2011-03-16

Schreibe einen Kommentar