Ich fand dieses hervorragende Tutorial zu regulären Ausdrücken und obwohl ich intuitiv verstehe, was "gierige", "widerstrebende" und "besitzergreifende" Quantifizierer tun, scheint es eine ernsthafte Lücke in meinem Verständnis zu geben.
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.
In der Erklärung wird erwähnt , dass die gesamte Eingabezeichenfolge gegessen wurde , Buchstaben verbraucht wurden , der Matcher zurückgesetzt wurde , dass das Auftreten von "foo" ganz rechts wieder aufflammte usw.
Leider verstehe ich trotz der schönen Metaphern immer noch nicht, was von wem gegessen wird ... Kennen Sie ein anderes Tutorial, das (kurz) erklärt, wie Engines-Engines funktionieren?
Wenn jemand den folgenden Absatz in einer etwas anderen Formulierung erklären kann, wäre dies sehr dankbar:
Im ersten Beispiel wird der gierige Quantifizierer * verwendet, um "alles" null oder mehrmals zu finden, gefolgt von den Buchstaben "f" "o" "o". Da der Quantifizierer gierig ist, frisst der. * -Teil des Ausdrucks zuerst die gesamte Eingabezeichenfolge. Zu diesem Zeitpunkt kann der Gesamtausdruck nicht erfolgreich sein, da die letzten drei Buchstaben ("f" "o" "o") bereits verbraucht wurden ( von wem? ). Der Matcher zieht sich also langsam ( von rechts nach links? ) Buchstabe für Buchstabe zurück, bis das Auftreten von "foo" ganz rechts wieder aufgeflogen ist ( was bedeutet das? ). An diesem Punkt ist das Match erfolgreich und die Suche endet.
Das zweite Beispiel ist jedoch zurückhaltend, daher beginnt es damit, zuerst ( von wem? ) "Nichts" zu konsumieren . Da "foo" nicht am Anfang der Zeichenfolge erscheint, muss der erste Buchstabe (ein "x") geschluckt werden ( wer schluckt?), Was die erste Übereinstimmung bei 0 und 4 auslöst. Unser Testgeschirr setzt den Vorgang fort bis die Eingabezeichenfolge erschöpft ist. Es findet eine weitere Übereinstimmung bei 4 und 13.
Das dritte Beispiel findet keine Übereinstimmung, weil der Quantifizierer besitzergreifend ist. In diesem Fall wird die gesamte Eingabezeichenfolge von. * + ( Wie? ) Verbraucht, sodass nichts übrig bleibt, um das "foo" am Ende des Ausdrucks zu erfüllen. Verwenden Sie einen Possessivquantifizierer für Situationen, in denen Sie alles erfassen möchten, ohne sich jemals zurückzuziehen ( was bedeutet Zurücksetzen? ). In Fällen, in denen die Übereinstimmung nicht sofort gefunden wird, übertrifft sie den entsprechenden gierigen Quantifizierer.
*
,+
und?
sind gierig. Minimal quantifiers mögen*?
,+?
und??
sind faul. Possessive Quantoren mögen*+
,++
und?+
sind klebrig.