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


Answers:


225

如果您要使用正则表达式进行验证,则始终需要使用\A\z^并且$只会匹配直到换行符为止,这意味着他们可以像这样使用电子邮件me@example.com\n<script>dangerous_stuff();</script>并仍然对其进行验证,因为正则表达式只能看到之前的所有内容\n

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


13
@Ragmaanir是正确的,应该用小写字母\z代替 \Z
彼得(Petr)2012年

10
+1谢谢!尽管我不同意您的建议:A)如果有适当的建议,不要添加不必要的工作/处理,并且B)尤其是如果它使您对区分这两者保持懒惰,则不要这样做。您可能并不总是只能对Regex进行字符串操作,因此将正确的字符串提交给内存并了解其中的区别!
dooleyo 2014年

1
我不理解带有危险内容的示例,因为在这两种情况下,都可能在字符串中包含危险内容,无论是否有新行,这都是一种利用html清理和验证解决的漏洞。
杰尔·莫塔

2
@JayrMotta演示所显示的是,危险的东西将完全绕过您的整个正则表达式检查。因此,即使您要在正则表达式中检查危险的内容,如果您过去习惯$检查“字符串结尾”而不是,它也会被绕过\z
Blue Blue医生

177

根据

^ 匹配行首。

$ 匹配行尾。

\A 匹配字符串的开头。

\z 匹配字符串的结尾。

\Z 匹配字符串的末尾,除非字符串以a结尾"\n",在这种情况下,它恰好在之前匹配"\n"

因此,请使用\A和小写\z。如果您使用\Z某人,则可以潜入换行符。我认为这并不危险,但是可能会使假设字符串中没有空格的算法搞砸。根据您的正则表达式和字符串长度约束,有人可以使用仅带有换行符的不可见名称。

JavaScript的Regex实现被视为\A文字'A'ref)。因此,请注意自己并进行测试。


16

字符串的开头和结尾不一定与行的开头和结尾相同。想象一下,如果您使用以下内容作为测试字符串:

我的
名字

安德鲁

请注意,该字符串中有许多行-中^$人物让你匹配线(基本治疗的开始和结束\n的字符作为分隔符),而\A\Z允许您匹配整个字符串的开头和结尾。


1
我认为最好的答案。“基本上将\ n字符视为分隔符”确实帮助我理解了,谢谢。
Flyout91

11

实例差异

  1. /^foo$/符合以下任一条件,/\Afoo\z/但不符合:
whatever1
foo
whatever2
foo
whatever2
whatever1
foo
  1. /^foo$/并且/\Afoo\z/都符合以下条件:
foo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.