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 ...)


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 .

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.