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