web-dev-qa-db-fra.com

Quelle est la signification de + dans une expression régulière?

Que signifie le symbole plus dans l'expression régulière?

33
NoodleOfDeath

+ peut en fait avoir deux significations, selon le contexte.

Comme les autres réponses mentionnées, + est généralement un opérateur répétition et fait répéter le jeton précédent une ou plusieurs fois. a+ serait exprimé comme aa* dans théorie du langage formel , et pourrait également être exprimé comme a{1,} (correspond à un minimum de 1 fois et un maximum de temps infinis).


Cependant, + peut aussi rendre d'autres quantificateurs possessifs s'il suit un opérateur de répétition (ie ?+, *+, ++ ou {m,n}+). Un quantificateur possessif est une fonctionnalité avancée de certaines saveurs regex (PCRE, Java et le moteur JGsoft) qui indique au moteur de ne pas revenir en arrière une fois la correspondance établie.

Pour comprendre comment cela fonctionne, nous devons comprendre deux concepts de moteurs d'expression régulière: gourmandise et retour en arrière . La gourmandise signifie qu'en général, les regex essaieront de consommer autant de personnages que possible. Disons que notre modèle est .* (le point est une construction spéciale dans les expressions régulières qui signifie n'importe quel caractère 1; l'étoile signifie correspondre à zéro ou plusieurs fois), et votre cible est aaaaaaaab. La chaîne entière sera consommée, car la chaîne entière est la correspondance la plus longue qui satisfait le modèle.

Supposons cependant que nous modifions le modèle en .*b. Désormais, lorsque le moteur d'expression régulière tente de faire correspondre aaaaaaaab, le .* consommera à nouveau la chaîne entière. Cependant, puisque le moteur aura atteint la fin de la chaîne et que le modèle n'est pas encore satisfait (le .* a tout consommé mais le modèle doit toujours correspondre à b par la suite), il reviendra en arrière , un caractère à la fois, et essayera pour correspondre à b. La première marche arrière fera le .* consomme aaaaaaaa, puis b peut consommer b, et le modèle réussit.

Les quantificateurs possessifs sont également gourmands, mais comme mentionné, une fois qu'ils retournent une correspondance, le moteur ne peut plus revenir en arrière au-delà de ce point. Donc, si nous changeons notre modèle en .*+b (correspond à n'importe quel caractère zéro ou plusieurs fois, possessivement, suivi d'un b), et essayez de faire correspondre aaaaaaaab, encore une fois le .* consommera la chaîne entière, mais étant donné qu'elle est possessive, les informations de retour en arrière sont ignorées et le b ne peut pas être mis en correspondance, le modèle échoue.


1 Dans la plupart des moteurs, le point ne correspondra pas à un caractère de nouvelle ligne, sauf si le /s ("singleline" ou "dotall") modifier est spécifié.

59

Dans la plupart des implémentations + signifie "un ou plusieurs".

Dans certains écrits théoriques + est utilisé pour signifier "ou" (la plupart des implémentations utilisent le | symbole pour cela).

12
sepp2k

1 ou plus de l'expression précédente.

[0-9]+

Correspondrait:

1234567890

Dans:

J'ai 1234567890 dollars

6
Chris

Une ou plusieurs occurrences des symboles précédents.

Par exemple. a+ signifie la lettre a une ou plusieurs fois. Ainsi, a correspond à a, aa, aaaaaa mais pas une chaîne vide.

Si vous savez ce que l'astérisque (*) signifie que vous pouvez exprimer (exp)+ comme (exp)(exp)*, où (exp) est une expression régulière.

3
phimuemue