Différence Regex Plus vs Star?

90

Quelle est la différence entre:

(.+?)

et

(.*?)

quand je l'utilise dans mon preg_matchregex php ?

David19801
la source

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

stema
la source
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 ( .).

Quentin
la source
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.

DaveRandom
la source
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.

Xophmeister
la source
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
Azri Jamil
la source
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.

jeroen
la source
"+ 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

Miladiouss
la source
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.

Le fantôme de Madara
la source
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

Crt
la source