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的结尾。
以例子为例
-
/^foo$/
匹配以下任一项,/\Afoo\z/
不包含:
whatever1 foo whatever2
foo whatever2
whatever1 foo
-
/^foo$/
和/\Afoo\z/
全都符合以下内容:
foo