Regex pas opérateur

Existe-t-il un opérateur NOT dans les expressions régulières? Comme dans cette chaîne: "(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"

Je veux supprimer tout \([0-9a-zA-z _\.\-:]*\) mais pas celui où il se trouve une année: (2001) .

Donc, ce que le regex devrait renvoyer doit être: (2001) name .

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

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

Vous pouvez toutefois utiliser un lookahead négatif de largeur zéro:

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

La partie (?!...) signifie “ne correspond que si le texte suivant (donc: lookahead) ne correspond pas (donc: négatif) à cela. Mais il ne consum pas réellement les caractères correspondants (donc: zéro largeur).

Il y a en réalité 4 combinaisons de vues de 2 axes:

  • lookbehind / lookahead: spécifie si les caractères avant ou après le point sont considérés
  • positif / négatif: spécifie si les caractères doivent correspondre ou ne pas correspondre.

Pas tout à fait, bien que généralement vous pouvez utiliser une solution de contournement sur l’une des formes

  • [^abc] , qui est tout sauf abc ,
  • ou lookahead négatif: a(?!b) , qui n’est pas suivi de b
  • ou lookbehind négatif: (? , qui n'est pas précédé d' a