187 votes

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

Dans la documentation que j'ai lue:

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

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

212voto

Luke Points 1910

Si vous dépendez de l'expression régulière pour la validation, vous voulez toujours utiliser \A et \z. ^ et $ ne correspondent qu'à un caractère de saut de ligne, ce qui signifie qu'ils pourraient utiliser un e-mail comme me@example.com\ndangerous_stuff(); et le valider quand même, puisque l'expression régulière ne voit que tout avant le \n.

Ma recommandation serait simplement de supprimer complètement les sauts de ligne d'un nom d'utilisateur ou d'un e-mail au préalable, puisque presque aucune raison légitime de le faire. Ensuite, vous pouvez utiliser en toute sécurité SOIT \A \z ou ^ $.

170voto

Ragmaanir Points 1087

Selon Pickaxe:

^ 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 elle se termine par un "\n", auquel cas cela correspond juste avant le "\n".

Par conséquent, utilisez \A et en minuscules \z. Si vous utilisez \Z, quelqu'un pourrait glisser un caractère de saut de ligne. Je ne pense pas que ce soit dangereux, mais cela pourrait perturber les algorithmes qui supposent qu'il n'y a pas d'espaces blancs dans la chaîne. En fonction de vos contraintes d'expression régulière et de longueur de chaîne, quelqu'un pourrait utiliser un nom invisible contenant uniquement un caractère de saut de ligne.

L'implémentation des expressions régulières de JavaScript traite \A comme un littéral 'A' (réf). Alors soyez vigilant et testez.

15voto

Andrew Hare Points 159332

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

my
name
is
Andrew

Remarquez que la chaîne contient plusieurs lignes - les caractères ^ et $ vous permettent de faire correspondre le début et la fin de ces lignes (en traitant essentiellement le caractère \n comme un délimiteur) tandis que \A et \Z vous permettent de faire correspondre le début et la fin de toute la chaîne.

9voto

user1738342 Points 321

Différence par exemple

  1. /^foo$/ correspond à l'un des éléments suivants, /\Afoo\z/ ne le fait pas :

    whatever1 foo whatever2

    foo whatever2

    whatever1 foo

  2. /^foo$/ et /\Afoo\z/ correspondent tous deux à ce qui suit :

    foo

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X