Ho trovato questo eccellente tutorial sulle espressioni regolari e mentre capisco intuitivamente cosa fanno i quantificatori "avidi", "riluttanti" e "possessivi", sembra esserci un serio buco nella mia comprensione.
Nello specifico, nell'esempio seguente:
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.
La spiegazione menziona alimentazione dell'intera stringa di input, lettere state consumate , matcher svitando , occorrenza più a destra di "foo" è stato rigurgitato , etc.
Sfortunatamente, nonostante le belle metafore, non capisco ancora cosa viene mangiato da chi ... Conosci un altro tutorial che spiega (in modo conciso) come funzionano i motori delle espressioni regolari?
In alternativa, se qualcuno può spiegare in modo leggermente diverso il seguente paragrafo, sarebbe molto apprezzato:
Il primo esempio usa il quantificatore avido. * Per trovare "qualsiasi cosa", zero o più volte, seguito dalle lettere "f" "o" "o". Poiché il quantificatore è avido, la porzione. * Dell'espressione mangia prima l'intera stringa di input. A questo punto, l'espressione complessiva non può avere successo, perché le ultime tre lettere ("f" "o" "o") sono già state consumate ( da chi? ). Quindi il matcher indietreggia lentamente ( da destra a sinistra? ) Una lettera alla volta fino a quando l'occorrenza più a destra di "pippo" è stata rigurgitata ( cosa significa? ), A quel punto la partita ha successo e la ricerca termina.
Il secondo esempio, tuttavia, è riluttante, quindi inizia col primo consumo ( da parte di chi? ) "Niente". Poiché "foo" non appare all'inizio della stringa, è costretto a deglutire ( chi deglutisce?) La prima lettera (una "x"), che fa scattare la prima partita a 0 e 4. Il nostro cablaggio di prova continua il processo fino a quando la stringa di input è esaurita. Trova un'altra corrispondenza a 4 e 13.
Il terzo esempio non riesce a trovare una corrispondenza perché il quantificatore è possessivo. In questo caso, l'intera stringa di input viene consumata da. * +, ( How? ) Senza lasciare nulla per soddisfare il "pippo" alla fine dell'espressione. Utilizzare un quantificatore possessivo per le situazioni in cui si desidera cogliere tutto senza mai arretrare ( cosa significa arretrare? ); supererà il quantificatore avido equivalente nei casi in cui la corrispondenza non viene trovata immediatamente.
*
,+
e?
sono avidi. Minimal quantificatori piace*?
,+?
e??
sono pigri. Possessivi quantificatori piace*+
,++
e?+
sono appiccicosi.