J'ai trouvé cet excellent tutoriel sur les expressions régulières et bien que je comprenne intuitivement ce que font les quantificateurs "avides", "réticents" et "possessifs", il semble y avoir un sérieux trou dans ma compréhension.
Plus précisément, dans l'exemple suivant:
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.
L'explication mentionne avoir mangé la chaîne d'entrée entière, des lettres ont été consommées , le matcher a reculé , l'occurrence la plus à droite de "foo" a été régurgitée , etc.
Malheureusement, malgré les belles métaphores, je ne comprends toujours pas ce qui est mangé par qui ... Connaissez-vous un autre tutoriel qui explique (de manière concise) comment fonctionnent les moteurs d'expressions régulières?
Alternativement, si quelqu'un peut expliquer dans une formulation quelque peu différente le paragraphe suivant, ce serait très apprécié:
Le premier exemple utilise le quantificateur gourmand. * Pour trouver "n'importe quoi", zéro ou plusieurs fois, suivi des lettres "f" "o" "o". Parce que le quantificateur est gourmand, la partie. * De l'expression mange d'abord la chaîne d'entrée entière. À ce stade, l'expression globale ne peut pas réussir, car les trois dernières lettres ("f" "o" "o") ont déjà été consommées ( par qui? ). Ainsi, le matcher recule lentement ( de droite à gauche? ) Une lettre à la fois jusqu'à ce que l'occurrence la plus à droite de "foo" soit régurgitée ( qu'est-ce que cela signifie? ), À quel point la correspondance réussit et la recherche se termine.
Le deuxième exemple, cependant, est réticent, il commence donc par consommer d'abord ( par qui? ) "Rien". Parce que "foo" n'apparaît pas au début de la chaîne, il est obligé d'avaler ( qui avale?) La première lettre (un "x"), ce qui déclenche la première correspondance à 0 et 4. Notre harnais de test continue le processus jusqu'à ce que la chaîne d'entrée soit épuisée. Il trouve un autre match à 4 et 13.
Le troisième exemple ne parvient pas à trouver une correspondance car le quantificateur est possessif. Dans ce cas, la chaîne d'entrée entière est consommée par. * +, ( Comment? ) Ne laissant rien pour satisfaire le "foo" à la fin de l'expression. Utilisez un quantificateur possessif pour les situations où vous voulez saisir tout quelque chose sans jamais reculer ( qu'est-ce que signifie reculer? ); il surpassera le quantificateur gourmand équivalent dans les cas où la correspondance n'est pas immédiatement trouvée.
*
,+
et?
sont avides. Minimal quantificateurs aiment*?
,+?
et??
sont paresseux. Possessifs quantificateurs aiment*+
,++
et?+
sont collants.