Разница между \ A \ z и ^ $ в регулярных выражениях Ruby - PullRequest
172 голосов
/ 23 февраля 2009

В документации я читаю:

Используйте \ A и \ z, чтобы соответствовать началу и концу строки, ^ и $ соответствуют началу / концу строки.

Я собираюсь применить регулярное выражение, чтобы проверить имя пользователя (или адрес электронной почты тот же), представленный пользователем. Какое выражение я должен использовать с validates_format_of в модели? Я не могу понять разницу: я всегда использовал ^ и $ ...

Ответы [ 4 ]

198 голосов
/ 23 февраля 2009

Если вы используете регулярное выражение для проверки, вам всегда нужно использовать \A и \z. ^ и $ будут совпадать только до символа новой строки, что означает, что они могут использовать электронную почту, такую ​​как me@example.com\n<script>dangerous_stuff();</script>, и при этом проверять ее, поскольку регулярное выражение видит все до \n.

Я бы порекомендовал просто убрать новые строки из имени пользователя или электронной почты заранее, поскольку для этого практически нет законной причины. Тогда вы можете безопасно использовать EITHER \A \z или ^ $.

161 голосов
/ 12 мая 2011

Согласно Кирка :

^ Соответствует началу строки.

$ Соответствует концу строки.

\A Соответствует началу строки.

\z Соответствует концу строки.

\Z Соответствует концу строки, если строка не заканчивается на "\n", и в этом случае она совпадает непосредственно перед "\n".

Итак, используйте \A и строчные буквы \z. Если вы используете \Z, кто-то может проникнуть в символ новой строки. Это не опасно, я думаю, но может испортить алгоритмы, которые предполагают, что в строке нет пробелов. В зависимости от вашего регулярного выражения и ограничений длины строки, кто-то может использовать невидимое имя только с символом новой строки.

Реализация JavaScript в Regex трактует \A как литерал 'A' ( ref ). Так что следи за собой и проверяй.

12 голосов
/ 23 февраля 2009

Начало и конец строки не обязательно совпадают с началом и концом строки. Представьте, что вы использовали следующую строку в качестве тестовой строки:

мой
Имя
есть
Andrew

Обратите внимание, что в строке много строк - символы ^ и $ позволяют сопоставить начало и конец этих строк (в основном обрабатывая символ \n как разделитель), тогда как \A и \Z позволяет вам сопоставить начало и конец всей строки.

7 голосов
/ 21 августа 2013

Разница по примеру

  1. /^foo$/ соответствует любому из следующих значений, /\Afoo\z/ не соответствует:
whatever1
foo
whatever2
foo
whatever2
whatever1
foo
  1. /^foo$/ и /\Afoo\z/ все соответствуют следующему:
foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...