Quelle est la différence entre:
(.+?)
et
(.*?)
quand je l'utilise dans mon preg_match
regex php ?
Ils sont appelés quantificateurs.
*
0 ou plus de l'expression précédente
+
1 ou plusieurs de l'expression précédente
Par défaut, un quantificateur est gourmand, ce qui signifie qu'il correspond à autant de caractères que possible.
L' ?
après qu'un quantificateur modifie le comportement pour rendre ce quantificateur "non consolé", cela signifie qu'il correspondra le moins possible.
Exemple gourmand / non gourmand
Par exemple sur la chaîne " abab "
a.*b
correspondra à "abab" (preg_match_all retournera une correspondance, le "abab")
while a.*?b
ne correspondra qu'au début "ab" (preg_match_all renverra deux correspondances, "ab")
Vous pouvez tester vos regex en ligne par exemple sur Regexr, voir l'exemple gourmand ici
(.+?)
et(.*?)
se comporter différemment dans une position différentes expressions régulières qui sonta(.+?)
,(.+?)b
,a(.+?)b
,a(.*?)
,(.*?)b
,a(.*?)b
..*
correspondra autant que possible. Si vous voulez vous arrêter le plus tôt possible, vous devez le rendre non gourmand.*?
Le premier (
+
) est un ou plusieurs caractères . Le deuxième (*
) contient zéro ou plusieurs caractères . Les deux sont non gourmands (?
) et correspondent à tout (.
).la source
A
+
correspond à une ou plusieurs instances du modèle précédent. A*
correspond à zéro ou plusieurs instances du modèle précédent.Donc, fondamentalement, si vous utilisez un,
+
il doit y avoir au moins une instance du modèle, si vous l'utilisez,*
il correspondra toujours s'il n'y en a pas.la source
+
correspond à au moins un caractère*
correspond à n'importe quel nombre (y compris 0) de caractèresLe
?
indique une expression paresseuse, donc elle correspondra au moins de caractères possible.la source
Considérez ci-dessous la chaîne à associer.
Le modèle
(ab.*)
renverra une correspondance pour le groupe de capture avec le résultat deab
Alors que le modèle
(ab.+)
ne correspondra pas et ne retournera rien.Mais si vous changez la chaîne en suivant, elle reviendra
aba
pour motif(ab.+)
la source
+
est un minimum,*
peut être égal à zéro.la source
"+ is minimal one"
Que signifie cette phrase?Dans RegEx,
{i,f}
signifie "entrei
lesf
correspondances". Jetons un coup d'œil aux exemples suivants:{3,7}
signifie entre 3 et 7 matchs{,10}
signifie jusqu'à 10 correspondances sans limite inférieure (c'est-à-dire que la limite basse est 0){3,}
signifie au moins 3 correspondances sans limite supérieure (c'est-à-dire que la limite haute est l'infini){,}
signifie 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 bonnes langues contiennent des abréviations, tout comme RegEx:
+
est le raccourci pour{1,}
*
est le raccourci pour{,}
?
est le raccourci pour{,1}
Cela signifie qu'il
+
faut au moins 1 correspondance tout en*
acceptant n'importe quel nombre de correspondances ou aucune correspondance du tout et?
n'accepte pas plus d'une correspondance ou zéro correspondance.Crédit: Codecademy.com
la source
Une étoile est très similaire à un plus, la seule différence est que si le plus correspond à 1 ou plus du caractère / groupe précédent, l'étoile correspond à 0 ou plus.
la source
Je pense que les réponses précédentes ne mettent pas en évidence un exemple simple:
par exemple nous avons un tableau:
numbers = [5, 15]
L'expression regex suivante
^[0-9]+
correspond à:15
uniquement. Cependant,^[0-9]*
correspond aux deux5 and 15
. La différence est que l'+
opérateur nécessite au moins un duplicata de l'expression regex précédentela source