Encontrei este excelente tutorial sobre expressões regulares e, embora compreenda intuitivamente o que os quantificadores "gananciosos", "relutantes" e "possessivos" fazem, parece haver um sério buraco no meu entendimento.
Especificamente, no exemplo a seguir:
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.
A explicação menciona comer toda a cadeia de entrada, letras sido consumida , matcher recuando , a ocorrência mais à direita de "foo" foi regurgitado , etc.
Infelizmente, apesar das boas metáforas, ainda não entendo o que é comido por quem ... Você conhece outro tutorial que explica (concisa) como os mecanismos de expressões regulares funcionam?
Como alternativa, se alguém puder explicar de maneira um pouco diferente o seguinte parágrafo, isso seria muito apreciado:
O primeiro exemplo usa o quantificador ganancioso. * Para encontrar "qualquer coisa", zero ou mais vezes, seguido pelas letras "f" "o" "o". Como o quantificador é ganancioso, a parte. * Da expressão come primeiro toda a cadeia de entrada. Nesse ponto, a expressão geral não pode ser bem-sucedida, porque as três últimas letras ("f" "o" "o") já foram consumidas ( por quem? ). Portanto, o correspondente recua lentamente ( da direita para a esquerda? ) Uma letra de cada vez até que a ocorrência mais à direita de "foo" seja regurgitada ( o que isso significa? ), Momento em que a correspondência é bem-sucedida e a pesquisa termina.
O segundo exemplo, no entanto, é relutante, então começa consumindo primeiro ( por quem? ) "Nada". Como "foo" não aparece no início da string, é forçado a engolir ( quem engole?) A primeira letra (um "x"), que aciona a primeira correspondência em 0 e 4. Nosso equipamento de teste continua o processo até a sequência de entrada estar esgotada. Encontra outra partida em 4 e 13.
O terceiro exemplo falha ao encontrar uma correspondência porque o quantificador é possessivo. Nesse caso, toda a cadeia de entrada é consumida por. * +, ( Como? ), Não sobrando nada para satisfazer o "foo" no final da expressão. Use um quantificador possessivo para situações em que você deseja aproveitar tudo sem jamais recuar (o que significa recuar? ); superará o quantificador ganancioso equivalente nos casos em que a correspondência não for encontrada imediatamente.
*
,+
e?
são gananciosos. Mínimas quantificadores gosto*?
,+?
e??
são preguiçosos. Possessivos quantificadores gosto*+
,++
e?+
são pegajoso.