Ruby正则表达式中\ A \ z和^ $之间的区别

时间:2009-02-23 13:36:57

标签: ruby regex

在我阅读的文档中:

  

使用\ A和\ z匹配字符串的开头和结尾,^和$匹配一行的开头/结尾。

我将应用正则表达式来检查用户提交的用户名(或电子邮件是否相同)。我应该在模型中使用哪个表达式validates_format_of?我无法理解其中的区别:我总是使用^和$ ...

4 个答案:

答案 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)

差异示例

  1. /^foo$/符合以下任何一项,/\Afoo\z/不符合:
  2. whatever1
    foo
    whatever2
    foo
    whatever2
    whatever1
    foo
    1. /^foo$//\Afoo\z/都符合以下条件:
    2. foo