web-dev-qa-db-fra.com

Différence entre \ A \ z et ^ $ dans Ruby expressions régulières

Dans la documentation, j'ai lu:

Utilisez\A et\z pour faire correspondre le début et la fin de la chaîne, ^ et $ correspondent au début/à la fin d'une ligne.

Je vais appliquer une expression régulière pour vérifier le nom d'utilisateur (ou le courrier électronique est identique) envoyé par l'utilisateur. Quelle expression dois-je utiliser avec validates_format_of dans le modèle? Je ne comprends pas la différence: j'ai toujours utilisé ^ et $ ...

178
collimarco

Si vous dépendez de l'expression régulière pour la validation, vous voulez toujours utiliser \A Et \z. ^ Et $ Ne correspondront que jusqu'à un caractère de nouvelle ligne, ce qui signifie qu'ils pourraient utiliser un email comme [email protected]\n<script>dangerous_stuff();</script> et le faire valider, car la regex ne voit que tout avant le \n.

Ma recommandation serait de supprimer complètement les nouvelles lignes d’un nom d’utilisateur ou d’un courrier électronique, car il n’existe pratiquement aucune raison légitime de le faire. Ensuite, vous pouvez utiliser en toute sécurité SOIT \A\z Ou ^$.

206
Luke

Selon pioche :

^ Correspond au début d'une ligne.

$ Correspond à la fin d'une ligne.

\A Correspond au début de la chaîne.

\z Correspond à la fin de la chaîne.

\Z Correspond à la fin de la chaîne, sauf si celle-ci se termine par un "\n", auquel cas il correspond juste avant le "\n".

Alors, utilisez \A et minuscules \z. Si tu utilises \Z quelqu'un pourrait se faufiler dans un caractère de nouvelle ligne. Ce n'est pas dangereux à mon avis, mais pourrait bousiller des algorithmes qui supposent qu'il n'y a pas d'espace dans la chaîne. En fonction de vos contraintes de regex et de longueur de chaîne, une personne peut utiliser un nom invisible avec uniquement un caractère de nouvelle ligne.

L'implémentation JavaScript de Regex traite \A comme littéral 'A' _ ( ref ). Alors surveillez-vous et testez.

166
Ragmaanir

Le début et la fin d'une chaîne peuvent ne pas être nécessairement la même chose que le début et la fin d'une ligne. Imaginez si vous utilisiez les éléments suivants comme chaîne de test:

mon
prénom
est
Andrew

Notez que la chaîne contient de nombreuses lignes - le ^ et $ Les caractères vous permettent de faire correspondre le début et la fin de ces lignes (en traitant essentiellement le \n caractère comme séparateur) tandis que \A et \Z vous permet de faire correspondre le début et la fin de la chaîne entière.

14
Andrew Hare

Différence par exemple

  1. /^foo$/ correspond à l'un des éléments suivants, /\Afoo\z/ ne fait pas:
whatever1
foo
whatever2
foo
whatever2
whatever1
foo
  1. /^foo$/ et /\Afoo\z/ tous correspondent aux éléments suivants:
foo
8
Chun Yang