J'ai un regex, par exemple (ma|(t){1})
. Il correspond à ma
et t
et ne correspond pas à bla
.
Je veux nier la regex, donc elle doit correspondre à bla
et non pas ma
et t
, en ajoutant quelque chose à cette regex . Je sais que je peux écrire bla
, la regex réelle est toutefois plus complexe.
Utiliser une recherche négative: (?!
pattern
)
Des lookarounds positifs peuvent être utilisés pour affirmer qu'un motif correspond. Les lookarounds négatifs sont le contraire: ils sont utilisés pour affirmer qu'un motif ne correspond pas. Certains arômes soutiennent des assertions; certains mettent des limites sur le lookbehind, etc.
Ce sont des tentatives pour trouver des solutions de regex aux problèmes de jouets sous forme d'exercices; ils doivent être instructifs si vous essayez d’apprendre les différentes manières d’utiliser les lookarounds (imbrication, utilisation, capture, etc.):
En supposant que vous souhaitiez uniquement interdire les chaînes qui correspondent complètement à l'expression rationnelle (c'est-à-dire que mmbla
est correct, mais que mm
ne l'est pas), voici ce que vous voulez:
^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)
est un négatif lookahead ; il dit "à partir de la position actuelle, les caractères suivants sont pasmm
ou t
, suivis de la fin de la chaîne." L'ancre de départ (^
) au début garantit que le lookahead est appliqué au début de la chaîne. Si cela réussit, le .*
continue et consomme la chaîne.
Pour votre information, 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 requis, cependant.
\b(?=\w)(?!(ma|(t){1}))\b(\w*)
c'est pour la regex donnée.
le\b doit trouver la limite de Word.
le regard positif à venir (? =\w) est là pour éviter les espaces.
l’aspect négatif devant la regex originale est d’empêcher toute correspondance.
.__ et enfin le (\ w *) est d’attraper tous les mots qui restent.
le groupe qui contiendra les mots est le groupe 3.
le simple (?! pattern) ne fonctionnera pas car aucune sous-chaîne ne correspondra
le simple ^ (?! (?: m {2} | t) $). * $ ne fonctionnera pas car sa granularité est constituée de lignes pleines