Quelle est la différence entre:
(.+?)
et
(.*?)
quand je l'utilise dans mon php preg_match
regex?
Ils s'appellent 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, ce qui signifie qu'il correspond au plus grand nombre de caractères possible.
Le ?
après qu'un quantificateur ait changé le comportement pour rendre ce quantificateur "ungreedy", cela signifie qu'il correspondra le moins possible.
Exemple gourmand/désagréable
Par exemple sur la chaîne " abab"
a.*b
correspondra à "abab" (preg_match_all retournera une correspondance, le "abab")
tandis que a.*?b
ne fera correspondre que le "ab" de départ (preg_match_all retournera deux correspondances, "ab")
Vous pouvez tester vos expressions rationnelles en ligne, par exemple. sur Regexr, voir l'exemple glouton ici
La première (+
) est n ou plusieurs caractères. La deuxième (*
) est zéro ou plusieurs caractères. Les deux sont non-gourmands (?
) et correspond à tout (.
).
UNE +
correspond à n ou plusieurs occurrences du modèle précédent. UNE *
correspond à zéro ou plus occurrences du modèle précédent.
Donc, fondamentalement, si vous utilisez un +
il doit y avoir au moins une instance du motif, si vous utilisez *
cela correspondra s'il n'y a pas d'instance.
+
correspond à au moins un caractère
*
correspond à n’importe quel nombre (y compris 0) de caractères
Le ?
indique une expression paresseuse, elle correspondra donc au moins de caractères possible.
+
est minimal, *
peut être égal à zéro également.
Considérez ci-dessous la chaîne à comparer.
ab
Le motif (ab.*)
retournera une correspondance pour le groupe de capture avec le résultat de ab
Alors que le motif (ab.+)
ne correspondra pas et ne retournera rien.
Mais si vous modifiez la chaîne en suivant, il retournera aba
pour le motif (ab.+)
aba
Une étoile est très similaire à un plus, la seule différence est que, si le plus correspond à 1 ou plusieurs des personnages/groupes précédents, le début correspond à 0 ou plus.
Dans RegEx, {i,f}
signifie "entre i
et f
correspond". Jetons un coup d'oeil aux exemples suivants:
{3,7}
signifie entre 3 et 7 allumettes{,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 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 l’abréviation de {1,}
*
est l’abréviation de {,}
?
est l’abréviation de {,1}
Ça signifie +
nécessite au moins 1 correspondance tandis que *
accepte un nombre quelconque de correspondances ou aucune correspondance et ?
n'accepte pas plus d'une correspondance ou aucune correspondance.
Crédit: Codecademy.com
Je pense que les réponses précédentes ne parviennent pas à mettre en évidence un exemple simple:
par exemple nous avons un tableau:
numbers = [5, 15]
L'expression d'expression régulière suivante ^[0-9]+
allumettes: 15
seulement. Toutefois, ^[0-9]*
correspond aux deux 5 and 15
. La différence est que le +
l'opérateur nécessite au moins un dupliquer de l'expression regex précédente