Différence Regex Plus vs Star?


90

Quelle est la différence entre:

(.+?)

et

(.*?)

quand je l'utilise dans mon preg_matchregex php ?

Réponses:


150

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.*?bne 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


2
"paresseux" est le terme le plus courant pour "ungreedy"
Walter Tross

L'exemple est incorrect. Les deux (.+?)et (.*?)se comporter différemment dans une position différentes expressions régulières qui sont a(.+?), (.+?)b, a(.+?)b, a(.*?), (.*?)b, a(.*?)b.
Louis55

Pourquoi a. * B ne rendrait-il pas "ab"? N'est-ce pas dire "mot qui a entre a et b, 0 ou plus de caractères", par conséquent, ab a zéro caractère entre et pourrait être une correspondance. Pourquoi est-ce incorrect?
Hello World le

@HelloWorld, cela a à voir avec la gourmandise que j'ai expliquée ci-dessus. .*correspondra autant que possible. Si vous voulez vous arrêter le plus tôt possible, vous devez le rendre non gourmand.*?
stema le

22

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


1
Cela dépend si le modificateur s est défini ou non.
Quentin

8

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.


8

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


8

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 abapour motif(ab.+)

aba

Je pense que c'est la meilleure réponse spécifiquement à la question de + vs *
Terrence

6

+est un minimum, *peut être égal à zéro.


"+ is minimal one"Que signifie cette phrase?
Dét

5

Dans RegEx, {i,f}signifie "entre iles fcorrespondances". 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


4

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.


2

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 à: 15uniquement. 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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.