web-dev-qa-db-fra.com

Regex plus vs différence des étoiles?

Quelle est la différence entre:

(.+?)

et

(.*?)

quand je l'utilise dans mon php preg_match regex?

73
David19801

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

118
stema

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 (.).

20
Quentin

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.

6
DaveRandom

+ 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.

6
Xophmeister

+ est minimal, * peut être égal à zéro également.

5
jeroen

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
5
wajatimur

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.

3
Madara Uchiha

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 4

La 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

2
Miladiouss

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

1
Crt