web-dev-qa-db-fra.com

Regex pas opérateur

Y a-t-il un opérateur NOT dans Regexes? Comme dans cette chaîne: "(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"

Je veux supprimer tous les \([0-9a-zA-z _\.\-:]*\) mais pas celui où il s'agit d'un an: (2001).

Donc, ce que l'expression rationnelle doit renvoyer doit être: (2001) name.

NOTE: quelque chose comme \((?![\d]){4}[0-9a-zA-z _\.\-:]*\) ne fonctionne pas pour moi (le (20019) Correspond aussi ...)

64
Sonnenhut

Non, il n'y a pas d'opérateur direct ou non. Au moins, pas comme vous l'espérez.

Vous pouvez utiliser un préfixe négatif de largeur nulle, cependant:

\((?!2001)[0-9a-zA-z _\.\-:]*\)

Le (?!...) partie signifie "ne correspond que si le texte suivant (d'où: lookahead) this ne le fait pas (donc: négatif) correspond à cela. Mais il ne consomme pas réellement les caractères auxquels il correspond (donc: largeur zéro) .

Il existe actuellement 4 combinaisons de lookarounds avec 2 axes:

  • lookbehind/lookahead: spécifie si les caractères avant ou après le point sont pris en considération
  • positif/négatif: indique si les caractères doivent correspondre ou ne doivent pas correspondre .
72
Joachim Sauer

Pas tout à fait, même si généralement vous pouvez utiliser une solution de contournement sur l’un des formulaires.

  • [^abc], Qui est caractère par caractère et non a ou b ou c,
  • ou lookahead négatif: a(?!b), qui est a non suivi de b
  • ou lookbehind négatif: (?<!a)b, qui est b pas précédé de a
124
Johan Sjöberg