Comment nier tout le regex?

J’ai une expression régulière, par exemple (ma|(t){1}) . Il correspond à ma et t et ne correspond pas à bla .

Je veux nier le regex, donc il doit correspondre à bla et non à ma et t , en ajoutant quelque chose à cette regex . Je sais que je peux écrire bla , la regex réelle est cependant plus complexe.

Utilisez un lookaround négatif: (?! pattern )

Les vues positives peuvent être utilisées pour affirmer qu’un motif correspond. Le lookar négatif est l’inverse: il est utilisé pour affirmer qu’un pattern NE CORRESPOND PAS. Certains arômes supportent les assertions; certains imposent des limites sur l’apparence, etc.

Liens vers regular-expressions.info

  • Lookahead et Lookbehind Zero-Largeur Assertions
  • Comparaison de saveur

Voir également

  • Comment convertir CamelCase en noms lisibles par l’homme en Java?
  • Regex pour toutes les chaînes ne contenant pas de chaîne?
  • Une expression régulière pour correspondre à une sous-chaîne qui n’est pas suivie par une autre sous-chaîne.

Plus d’exemples

Ce sont des tentatives pour trouver des solutions de regex aux problèmes de jouets comme des exercices; elles doivent être pédagogiques si vous essayez d’apprendre les différentes manières d’utiliser les systèmes d’affichage (leur imbrication, leur utilisation pour capturer, etc.):

  • codingBat plusOut utilisant regex
  • codingBat repeatEnd en utilisant regex
  • codingbat wordEnds utilisant regex

En supposant que vous ne vouliez interdire que les chaînes qui correspondent parfaitement à la regex (c’est-à-dire que mmbla est correct, mais mm ne l’est pas), c’est ce que vous voulez:

 ^(?!(?:m{2}|t)$).*$ 

(?!(?:m{2}|t)$) est une recherche négative. il dit “à partir de la position actuelle, les caractères suivants ne sont ni mm ni t , suivis de la fin de la chaîne.” L’ancre de début ( ^ ) au début garantit que le lookahead est appliqué au début de la chaîne. Si cela réussit, le .* Avance et consum la chaîne.

FYI, si vous utilisez la méthode matches() de Java, vous n’avez pas vraiment besoin du $ et du $ final, mais ils ne font pas de mal. Le $ à l’intérieur du lookahead est cependant nécessaire.

 \b(?=\w)(?!(ma|(t){1}))\b(\w*) 

c’est pour le regex donné.
le \ b est pour trouver la limite de mot.
le regard positif en avant (? = \ w) est là pour éviter les espaces.
le point négatif sur le regex original est d’empêcher les correspondances.
et enfin le (\ w *) est pour attraper tous les mots qui restnt.
le groupe qui tiendra les mots est le groupe 3.
le simple (? modèle) ne fonctionnera pas comme n’importe quelle sous-chaîne correspondra
le simple ^ (?! (?: m {2} | t) $). * $ ne fonctionnera pas car sa granularité est des lignes complètes