J'ai une regex, par exemple (ma|(t){1})
. Cela 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 à ce regex . Je sais que je peux écrire bla
, la regex réelle est cependant plus complexe.
regex
regex-negation
IAdapter
la source
la source
{1}
c'est complètement inutile. (Si vous pensez que cela apporte une certaine valeur, pourquoi n'écrivez-vous pas((m{1}a{1}){1}|(t){1}){1}
?)Réponses:
Utilisez une recherche négative:
(?!
pattern
)
Des recherches positives peuvent être utilisées pour affirmer qu'un modèle correspond. Les vérifications négatives sont le contraire: elles sont utilisées pour affirmer qu'un modèle NE correspond PAS. Certaines saveurs soutiennent les assertions; certains mettent des limites à regarder en arrière, etc.
Liens vers regular-expressions.info
Voir également
Plus d'exemples
Ce sont des tentatives pour trouver des solutions regex aux problèmes de jouets sous forme d'exercices; ils devraient être éducatifs si vous essayez d'apprendre les différentes façons dont vous pouvez utiliser les lookarounds (les imbriquer, les utiliser pour capturer, etc.):
la source
grep
.Pattern.compile("(?!(a.*b))").matcher("xab").matches()
devrait êtretrue
, non?En supposant que vous ne vouliez interdire que les chaînes qui correspondent complètement à l'expression régulière (c'est-à-dire que
mmbla
c'est correct, maismm
pas), voici ce que vous voulez:(?!(?:m{2}|t)$)
est une anticipation négative ; il dit "à partir de la position actuelle, les quelques caractères suivants ne sont pasmm
out
, suivis de la fin de la chaîne." L'ancre de début (^
) au début garantit que l'anticipation est appliquée au début de la chaîne. Si cela réussit, le.*
continue et consomme la chaîne.Pour info, si vous utilisez la
matches()
méthode Java , vous n'avez pas vraiment besoin du the^
et du final$
, mais ils ne font aucun mal. L'$
intérieur de l'anticipation est cependant nécessaire.la source
.*
à la fin de votre regex, sinon elle rejettera chaque chaîne.$
intérieur de l'anticipation négative ET celui.*
à la fin sont tous deux des bits critiques. Comme toujours avec les ER, un ensemble solide de tests unitaires est absolument essentiel pour bien faire les choses. Cette réponse est correcte à 100%.c'est pour la regex donnée.
le \ b est de trouver la limite du mot.
le regard positif vers l'avant (? = \ w) est ici pour éviter les espaces.
le regard négatif sur le regex original est d'empêcher les correspondances.
et enfin le (\ w *) est d'attraper tous les mots qui restent.
le groupe qui contiendra les mots est le groupe 3.
le simple (?! motif) ne fonctionnera pas car toute sous-chaîne correspondra
au simple ^ (?! (?: m {2} | t) $). * $ sera ne fonctionne pas car sa granularité est pleine de lignes
la source
Appliquez ceci si vous utilisez laravel.
Laravel a un not_regex où le champ en cours de validation ne doit pas correspondre à l'expression régulière donnée; utilise la
preg_match
fonction PHP en interne.la source