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 ...)
(2001) name
.Réponses:
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:
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:
la source
\((?![\d]{4})[0-9a-zA-z _\.\-:]+\)
il y a encore(20019)
dans ce{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 _\.\-:]+\)
\((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)
Alors il y a une parenthèse non fermée, n'est-ce pas?)
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)
.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 nona
oub
ouc
,a(?!b)
qui n'esta
pas suivi deb
(?<!a)b
qui n'estb
pas précédé para
la source
[^abc]
devrait signifier nona
oub
ouc
, pas "pas la chaîneabc
".