191 votes

Opérateur Regex non

Existe-t-il un opérateur NOT dans les Regex ? 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 celle où il s'agit d'une année : (2001) .

Donc ce que la regex doit retourner doit être : (2001) name .

NOTE : quelque chose comme \((?![\d]){4}[0-9a-zA-z _\.\-:]*\) ne fonctionne pas pour moi (le (20019) d'une manière ou d'une autre correspond aussi...)

1 votes

Il y a une chaîne comme ci-dessus et je veux la regexer, que le résultat de la regex soit : (2001) name .

291voto

Johan Sjöberg Points 20759

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

  • [^abc] qui n'est pas un caractère par caractère a o b o c ,
  • ou un lookahead négatif : a(?!b) qui est a non suivi par b
  • ou un regard négatif en arrière : (?<!a)b qui est b non précédé de a

0 votes

Yep, je pense que le look-behind négatif est (?<!a)b -- référence : expressions-régulières.info/reguliere.html

21 votes

Mais [^abc] ne devrait pas signifier a o b o c et non "pas la chaîne abc ".

0 votes

Merci. %[^sdf] o %(?!(s|d|f)) est égal à "contient %", mais pas "%s", "%d" ou "%f".

167voto

Joachim Sauer Points 133411

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

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

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

El (?!...) signifie "ne correspond que si le texte suivant (d'où : lookahead) ce n'a pas (donc : négatif) correspondent à cela. Mais ce n'est pas vraiment consommer les caractères qu'il correspond (d'où : largeur zéro).

Il existe en fait 4 combinaisons de solutions de contournement avec 2 axes :

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

0voto

gromit190 Points 1132

Vous pourriez capturer le (2001) et remplacer le reste par rien.

public static string extractYearString(string input) {
    return input.replaceAll(".*\(([0-9]{4})\).*", "$1");
}

var subject = "(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)";
var result = extractYearString(subject);
System.out.println(result); // <-- "2001"

.*\(([0-9]{4})\).* signifie

  • .* correspondre à n'importe quoi
  • \( correspond à un ( caractère
  • ( commencer la capture
  • [0-9]{4} tout chiffre unique quatre fois
  • ) capture finale
  • \) correspond à un ) caractère
  • .* n'importe quoi (reste de la chaîne)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X