Quelle est la différence entre:
(.+?)
et
(.*?)
quand je l'utilise dans mon preg_match
regex php ?
Quelle est la différence entre:
(.+?)
et
(.*?)
quand je l'utilise dans mon preg_match
regex php ?
Réponses:
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 sont a(.+?)
, (.+?)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.*?
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.
+
correspond à au moins un caractère
*
correspond à n'importe quel nombre (y compris 0) de caractères
Le ?
indique une expression paresseuse, donc elle correspondra au moins de caractères possible.
Considérez ci-dessous la chaîne à associer.
ab
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.+)
aba
Dans RegEx, {i,f}
signifie "entre i
les f
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 4 La 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
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.
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 deux 5 and 15
. La différence est que l' +
opérateur nécessite au moins un duplicata de l'expression regex précédente