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

在我读到的文档中:

使用\ A和\ z来匹配string的开始和结尾,^和$匹配一行的开始/结束。

我将使用正则expression式来检查用户提交的用户名(或电子邮件是相同的)。 我应该在模型中使用validates_format_of哪个expression式? 我不明白区别:我一直使用^和$ …

如果您依赖正则expression式进行validation,则始终要使用\A\z^$只会匹配一个换行符,这意味着他们可以使用像me@example.com\n<script>dangerous_stuff();</script>的电子邮件,并且仍然有效,因为正则expression式只能看到所有的在\n之前。

我的build议只是预先从用户名或电子邮件中完全删除,因为几乎没有合法理由。 然后,您可以安全地使用EITHER \A \z^ $

根据镐 :

^匹配一条线的开始。

$匹配一行的结尾。

\A匹配string的开头。

\z匹配string的结尾。

\Z匹配string的结尾,除非string以"\n"结尾,在这种情况下,它匹配"\n"

所以,使用\A和小写字母\z 。 如果你使用\Z有人可以潜入换行符。 我认为这不是危险的,但可能会搞砸假定string中没有空格的algorithm。 根据你的正则expression式和string长度约束,有人可以使用一个不可见的名字,只是一个换行符。

正则expression式的JavaScript实现将\A视为一个字面'A' ( ref )。 所以,看看你自己,然后testing。

string的开始和结束可能不一定与行的开始和结束相同。 想象一下,如果你使用以下作为你的testingstring:

我的
名称

安德鲁

请注意,string中有许多行 – ^$字符允许您匹配这些行的开头和结尾(基本上将\n字符视为分隔符),而\A\Z允许您匹配开头和整个string的结尾。

以例子为例

  1. /^foo$/匹配以下任一项, /\Afoo\z/不包含:
 whatever1 foo whatever2 
 foo whatever2 
 whatever1 foo 
  1. /^foo$//\Afoo\z/全都符合以下内容:
 foo