Négation de Regex?
je joue au golf Regex (http://regex.alf.nu/) et je fais le trou Abba. J'ai la suite de l'expression rationnelle qui correspond le mauvais côté entièrement (c'est ce que j'essayais de faire):
(([w])([w]))
cependant, j'essaie de le nier maintenant pour qu'il corresponde à l'autre côté. Je n'arrive pas à comprendre cette partie. J'ai essayé:
(?!([w])([w]))
Mais cela ne fonctionne pas. Des conseils des maîtres du regex?
3 réponses
Vous pouvez faire beaucoup plus court (et obtenir plus de points) en utilisant simplement .
et en supprimant les parenthèses:
^(?!.*(.)(.))
il s'assure juste qu'il n'y a pas de "abba" ("abba" signifie ici 4 lettres dans cet ordre particulier que nous ne voulons pas faire correspondre) dans n'importe quelle partie de la chaîne sans avoir à faire correspondre le mot entier.
à l'Aide de l'explication ici: https://stackoverflow.com/a/406408/584663
j'ai trouvé:^((?!((\w)(\w))).)*$
La clé ici s'avère être le premier signe^, et le .*
(?! ...) est une construction à long terme, et donc ne fait pas avancer le moteur de traitement regex.
/ (?! ...)/ sur son propre renvoie correctement un résultat négatif pour les éléments correspondant à l'expression à l'intérieur; mais pour les éléments qui ne correspondent pas (...) le moteur regex poursuit son traitement. Cependant, si votre regex ne contient que le (?! ) il n'y a plus rien à traiter et le traitement des regex poste jamais de progrès. (Voir cette grande réponse).
apparemment puisque le regex restant est vide, il correspond à n'importe quel segment de largeur zéro d'une corde, c.-à-d. qu'il correspond à n'importe quelle corde.
[begin SWAG]
avec le caret ^ présent, le moteur regex est capable de reconnaître que vous êtes à la recherche d'une vraie réponse et que vous ne voulez pas qu'il vous dise que la chaîne contient des composants de largeur zéro.
[end SWAG]
ainsi il est capable de ne pas correspondre correctement lorsque le (?! ) réussir.