Regex pas opérateur

109

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 est un an: (2001).

Alors , que l'expression rationnelle doit retourner doit être: (2001) name.

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

Sonnenhut
la source
1
Il y a une chaîne comme ci - dessus et je veux regex vers le haut, que le résultat de l'expression rationnelle est (2001) name.
Sonnenhut le

Réponses:

112

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

Vous pouvez toutefois utiliser une anticipation négative de largeur nulle:

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

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

Il existe en fait 4 combinaisons de lookarounds avec 2 axes:

  • lookbehind / lookahead: spécifie si les caractères avant ou après le point sont pris en compte
  • positif / négatif: spécifie si les caractères doivent correspondre ou non .
Joachim Sauer
la source
Merci le?! est ce que je voulais dire aussi, mais de toute façon si je l' utilise \((?![\d]{4})[0-9a-zA-z _\.\-:]+\)il y a encore (20019)dans ce
Sonnenhut
Dans l'édition de votre question, vous mettez l' {4} extérieur de l'anticipation et dans ce commentaire vous l'avez mis à l' intérieur : lequel avez-vous essayé? Aussi: si vous voulez (20019)faire correspondre, alors vous devez ajouter l' \) intérieur de votre lookahead:\((?![\d]{4}\))[0-9a-zA-z _\.\-:]+\)
Joachim Sauer
Avec le regex ci-dessus dans votre commentaire, cela fonctionne. Mais je ne comprends pas ça ... Je ne comprends pas pourquoi vous échappez à la partie suivante \((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)Alors il y a une parenthèse non fermée, n'est-ce pas?
Sonnenhut le
J'échappe à la parenthèse fermante )parce que je veux faire correspondre le caractère littéral) (comme vous le faites au tout début et à la toute fin de votre regex!). Ensuite, après avoir fait correspondre cela, je termine la recherche en utilisant un fichier sans échappement ).
Joachim Sauer le
Je l'ai. J'étais un peu confus par tous ces personnages. Je vous remercie.
Sonnenhut le
183

Pas tout à fait, bien que vous puissiez généralement utiliser une solution de contournement sur l'un des formulaires

  • [^abc], qui est caractère par caractère non aou bou c,
  • ou lookahead négatif:, a(?!b)qui n'est apas suivi deb
  • ou lookbehind négatif:, (?<!a)bqui n'est bpas précédé para
Johan Sjöberg
la source
Oui, je pense que l'observation négative est (? <! A) b - référence: regular-expressions.info/lookaround.html
jankins
8
Mais cela [^abc]devrait signifier non aou bou c, pas "pas la chaîne abc".
pleut