在我阅读的文档中:
使用\ A和\ z匹配字符串的开头和结尾,^和$匹配一行的开头/结尾。
我将应用正则表达式来检查用户提交的用户名(或电子邮件是否相同)。我应该在模型中使用哪个表达式validates_format_of
?我无法理解其中的区别:我总是使用^和$ ...
答案 0 :(得分:198)
如果您依赖正则表达式进行验证,则始终要使用\A
和\z
。 ^
和$
只会匹配换行符,这意味着他们可以使用me@example.com\n<script>dangerous_stuff();</script>
之类的电子邮件并仍然可以验证,因为正则表达式只能查看{{1}之前的所有内容}}
我的建议只是事先从用户名或电子邮件中完全删除新行,因为几乎没有正当理由。然后,您可以安全地使用EITHER \n
\A
或\z
^
。
答案 1 :(得分:160)
根据Pickaxe:
^
匹配一行的开头。
$
匹配一行的结尾。
\A
匹配字符串的开头。
\z
匹配字符串的结尾。
\Z
匹配字符串的结尾,除非字符串以"\n"
结尾,在这种情况下,它匹配"\n"
之前。
因此,请使用\A
和小写\z
。如果你使用\Z
,有人可以潜入换行符。我认为这并不危险,但可能搞砸假设字符串中没有空格的算法。根据你的正则表达式和字符串长度限制,有人可以使用一个只有换行符的隐形名称。
JavaScript的Regex实现将\A
视为文字'A'
(ref)。所以要注意自己并进行测试。
答案 2 :(得分:12)
字符串的开头和结尾可能不一定与行的开头和结尾相同。想象一下,如果您使用以下作为测试字符串:
我
命名
是
安德鲁
请注意,字符串中有许多行 - ^
和$
字符允许您匹配这些行的开头和结尾(基本上将\n
字符视为分隔符)\A
和\Z
允许您匹配整个字符串的开头和结尾。
答案 3 :(得分:7)
差异示例
/^foo$/
符合以下任何一项,/\Afoo\z/
不符合:whatever1
foo
whatever2
foo
whatever2
whatever1
foo
/^foo$/
和/\Afoo\z/
都符合以下条件:foo