133 votes

Regex plus vs différence étoile ?

Quelle est la différence entre :

(.+?)

y

(.*?)

quand je l'utilise dans mon php preg_match regex ?

210voto

stema Points 36113

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

8 votes

"paresseux" est le terme le plus courant pour "ingrat"

0 votes

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 .

0 votes

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 ?

23voto

Quentin Points 325526

Le premier ( + ) est un ou plusieurs caractères . Le second ( * ) est zéro ou plusieurs caractères . Les deux sont non gourmands ( ? ) et correspondre à n'importe quoi ( . ).

1 votes

Cela dépend si le modificateur s est activé ou non.

18voto

Miladiouss Points 642

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 4

La 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

11voto

Xophmeister Points 4281

+ correspond à au moins un caractère

* correspond à un nombre quelconque (y compris 0) de caractères

El ? indique une expression paresseuse, qui correspondra donc au moins de caractères possible.

10voto

DaveRandom Points 45661

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

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.

Powered by:

X