Разница между A z и ^ $ в регулярных выражениях Ruby



в документации я прочитала:




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




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

535   4  

4 ответов:

если вы зависите от регулярного выражения для проверки, вы всегда хотите использовать \A и \z. ^ и $ будет соответствовать только до символа новой строки, Что означает, что они могут использовать электронную почту, как [email protected]\n<script>dangerous_stuff();</script> и все еще есть его проверить, так как регулярное выражение видит только все перед \n.

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

по данным киркой:

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

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

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

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

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

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

реализация JavaScript регулярных выражений лечит \A в прямом 'A' ( ref). Так что следите за собой там и проверить.

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

мой
имя
это
Андрей

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

Разница На Примере

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

Comments

    Ничего не найдено.