Quel opérateur d'expression régulière signifie "Ne correspond pas" à ce caractère?

89

*, ?, +les caractères signifient tous correspondent à ce caractère. Quel caractère signifie «ne correspond pas» à cela? Des exemples aideraient.

Cliquez sur Upvote
la source
Pour une solution concernant le fait de ne pas correspondre à un mot - Voir ici stackoverflow.com/questions/406230
null

Réponses:

88

Vous pouvez utiliser des classes de caractères négatives pour exclure certains caractères: par exemple [^abcde], correspondra à tout sauf aux caractères a, b, c, d, e.

Au lieu de spécifier tous les caractères littéralement, vous pouvez utiliser des raccourcis à l' intérieur des classes de caractères: [\w](minuscules) correspondra à n'importe quel «caractère de mot» (lettre, chiffres et trait de soulignement), [\W](majuscule) correspondra à tout sauf aux caractères de mot; de même, [\d]correspondra aux chiffres 0-9 tandis que [\D]correspondra à tout sauf aux chiffres 0-9, et ainsi de suite.

Si vous utilisez PHP, vous pouvez consulter la documentation des classes de caractères regex .

Paolo Stefan
la source
80

Il y a deux façons de dire «ne correspondent pas»: des plages de caractères et une avant / arrière négative de largeur zéro.

L'ancien: ne correspondent pas a, b, cou 0:[^a-c0]

Ce dernier: correspond à n'importe quelle chaîne de trois lettres sauf fooet bar:

(?!foo|bar).{3}

ou

.{3}(?<!foo|bar)

En outre, une correction pour vous: *, ?et +ne correspond pas à quoi que ce soit. Ce sont des opérateurs de répétition et suivent toujours un opérateur correspondant. Ainsi, des a+moyens correspondent à un ou plusieurs a, des [a-c0]+moyens correspondent à un ou plusieurs a, b, cou 0, tout [^a-c0]+correspondrait à un ou plusieurs de tout ce qui n'a pas été a, b, cou 0.

Amadan
la source
^((?!foo).)+$Correspond à n'importe quelle ligne ne contenant pas foo regex101.com/r/z6a65l/4
Levi Baguley
48

[^] (entre [] ) est la négation dans une expression régulière alors que ^est "début de chaîne"

[^a-z] correspond à tout caractère unique qui ne va pas de "a" à "z"

^[a-z] signifie que la chaîne commence par "a" à "z"

Référence

diEcho
la source
8

^ utilisé au début d'une plage de caractères, ou assertions lookahead / lookbehind négatifs.

>>> re.match('[^f]', 'foo')
>>> re.match('[^f]', 'bar')
<_sre.SRE_Match object at 0x7f8b102ad6b0>
>>> re.match('(?!foo)...', 'foo')
>>> re.match('(?!foo)...', 'bar')
<_sre.SRE_Match object at 0x7f8b0fe70780>
Ignacio Vazquez-Abrams
la source
Devez-vous utiliser ?!dans les 2 derniers exemples ou pouvez-vous simplement l'utiliser !seul? Que fait ?-il?
Cliquez sur Upvote
Python a besoin ?de pour dire que c'est une extension. D'autres moteurs de regex peuvent avoir leurs propres règles.
Ignacio Vazquez-Abrams
@Click: C'est assez standard. regular-expressions.info/refadv.html , la plupart des manuels des moteurs d'expression régulière disent la même chose.
Amadan