Quelle est la différence entre :
(.+?)
y
(.*?)
quand je l'utilise dans mon php preg_match
regex ?
Quelle est la différence entre :
(.+?)
y
(.*?)
quand je l'utilise dans mon php preg_match
regex ?
On les appelle des quantificateurs.
*
0 ou plus de l'expression précédente
+
1 ou plusieurs des expressions précédentes
Par défaut, un quantificateur est gourmand, c'est-à-dire qu'il correspond à autant de caractères que possible.
El ?
après un quantificateur change le comportement pour rendre ce quantificateur "non gourmand", ce qui signifie qu'il correspondra le moins possible.
Exemple gourmand/imprévisible
Par exemple, sur la chaîne " abab "
a.*b
correspondra à "abab" (preg_match_all renverra une correspondance, le "abab")
tandis que a.*?b
ne correspondra qu'au "ab" initial (preg_match_all renverra deux correspondances, "ab").
Vous pouvez tester vos regex en ligne, par exemple sur Regexr, voir l'exemple gourmand ici
L'exemple est incorrect. Les deux (.+?)
y (.*?)
se comportent différemment dans une position variée d'expressions régulières qui sont a(.+?)
, (.+?)b
, a(.+?)b
, a(.*?)
, (.*?)b
, a(.*?)b
.
Pourquoi a.*b ne renverrait-il pas "ab" ? Ne dit-on pas "mot qui a entre a et b, 0 ou plus de caractères", donc, ab a zéro caractère entre et pourrait être une correspondance. Pourquoi est-ce incorrect ?
Dans RegEx, {i,f}
signifie "entre i
a f
matches". Examinons les exemples suivants :
{3,7}
signifie entre 3 et 7 matches{,10}
signifie jusqu'à 10 correspondances sans limite inférieure (c'est-à-dire que la limite inférieure est 0).{3,}
signifie au moins 3 correspondances sans limite supérieure (c'est-à-dire que la limite supérieure est l'infini){,}
signifie qu'il n'y a pas de limite supérieure ou inférieure pour le nombre de correspondances (c'est-à-dire que la limite inférieure est 0 et la limite supérieure est l'infini).{5}
signifie exactement 4La plupart des bons langages contiennent des abréviations, tout comme RegEx :
+
est l'abréviation de {1,}
*
est l'abréviation de {,}
?
est l'abréviation de {,1}
Cela signifie +
requiert au moins une correspondance alors que *
accepte un nombre quelconque de correspondances ou aucune correspondance et ?
n'accepte pas plus d'une correspondance ou zéro correspondance.
Crédit : Codecademy.com
A +
correspond à un ou plusieurs instances du motif précédent. A *
correspond à zéro ou plus instances du motif précédent.
Donc, en gros, si vous utilisez un +
il doit y avoir au moins une instance du motif, si vous utilisez la fonction *
elle correspondra toujours s'il n'y a pas d'instances de celle-ci.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.