【发布时间】:2010-10-09 07:47:18
【问题描述】:
在我阅读的文档中:
使用 \A 和 \z 匹配字符串的开始和结束,^ 和 $ 匹配行的开始/结束。
我将应用正则表达式来检查用户提交的用户名(或电子邮件是否相同)。我应该在模型中使用 validates_format_of 哪个表达式?我无法理解其中的区别:我一直使用 ^ 和 $ ...
【问题讨论】:
在我阅读的文档中:
使用 \A 和 \z 匹配字符串的开始和结束,^ 和 $ 匹配行的开始/结束。
我将应用正则表达式来检查用户提交的用户名(或电子邮件是否相同)。我应该在模型中使用 validates_format_of 哪个表达式?我无法理解其中的区别:我一直使用 ^ 和 $ ...
【问题讨论】:
如果您依赖正则表达式进行验证,您总是希望使用\A 和\z。 ^ 和 $ 只会匹配到换行符,这意味着他们可以使用像 me@example.com\n<script>dangerous_stuff();</script> 这样的电子邮件并仍然对其进行验证,因为正则表达式只能看到 \n 之前的所有内容。
我的建议是预先从用户名或电子邮件中完全删除新行,因为几乎没有正当理由。然后你可以安全地使用\A\z或^$。
【讨论】:
\z 而不是\Z!
$ 而不是 \z 来检查“字符串结尾”,它也会被绕过。
字符串的开头和结尾不一定与行的开头和结尾相同。想象一下,如果您使用以下内容作为测试字符串:
我的
名称
是
安德鲁
请注意,字符串中有很多行 - ^ 和 $ 字符允许您匹配这些行的开头和结尾(基本上将 \n 字符视为分隔符)而 \A 和\Z 允许你匹配整个字符串的开头和结尾。
【讨论】:
示例差异
/^foo$/ 匹配以下任何一项,/\Afoo\z/ 不匹配:whatever1
foo
whatever2
foo
whatever2
whatever1
foo
/^foo$/ 和 /\Afoo\z/ 都匹配以下内容:foo
【讨论】: