web-dev-qa-db-fra.com

Négation de regex?

Je joue au Regex Golf ( http://regex.alf.nu/ ) et je fais le trou Abba. J'ai l'expression régulière suivante qui correspond entièrement au mauvais côté (c'est ce que j'essayais de faire):

(([\w])([\w])\3\2)

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])\3\2)

Mais cela n'a pas fonctionné. Des conseils des maîtres des regex?

16
Lester Peabody

Vous pouvez le raccourcir (et gagner plus de points) en utilisant simplement . et en supprimant les parenthèses inutiles:

^(?!.*(.)(.)\2\1)

Il s'assure simplement qu'il n'y a pas "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.

23
Jerry

La clé ici s'avère être le signe d'insertion principal, ^ et le. *

(?! ...) est une construction prospective, et ne fait donc pas avancer le moteur de traitement des expressions rationnelles.

/ (?! ...)/à lui seul renverra 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 d'expression régulière continue le traitement. Cependant, si votre expression régulière contient uniquement le (?!), Il n'y a plus rien à traiter et la position de traitement de l'expression régulière ne progresse jamais. (Voir ceci grande réponse ).

Apparemment, puisque l'expression régulière restante est vide, elle correspond à n'importe quel segment de largeur nulle d'une chaîne, c'est-à-dire qu'elle correspond à n'importe quelle chaîne.

[Commencez Swag]

Avec le signe ^ présent, le moteur d'expression régulière est capable de reconnaître que vous cherchez une vraie réponse et que vous ne voulez pas qu'il vous dise que la chaîne contient des composants de largeur nulle.

[Fin Swag]

Ainsi, il est capable de ne pas correspondre correctement lorsque le (?!) Réussit.

2
inquist

En utilisant l'explication ici: https://stackoverflow.com/a/406408/58466

Je suis venu avec: ^((?!((\w)(\w)\4\3)).)*$

2
Bill