Ruby正则表达式中\A\z和^$之间的差异
在我阅读的文档中: 使用\A和\z匹配字符串的开头和结尾,^和$匹配行的开头/结尾Ruby正则表达式中\A\z和^$之间的差异,ruby,regex,Ruby,Regex,在我阅读的文档中: 使用\A和\z匹配字符串的开头和结尾,^和$匹配行的开头/结尾 我将应用一个正则表达式来检查用户提交的用户名(或者电子邮件是相同的)。我应该使用哪个表达式来验证模型中的格式?我无法理解其中的区别:我一直使用^and$…如果您依赖正则表达式进行验证,那么您总是希望使用\A和\z^和$将只匹配到换行符,这意味着他们可以使用类似me@example.com\大量的东西
我将应用一个正则表达式来检查用户提交的用户名(或者电子邮件是相同的)。我应该使用哪个表达式来验证模型中的格式?我无法理解其中的区别:我一直使用^and$…如果您依赖正则表达式进行验证,那么您总是希望使用
\A
和\z
^
和$
将只匹配到换行符,这意味着他们可以使用类似me@example.com\大量的东西因为正则表达式只会看到\n
之前的所有内容,所以仍然要验证它
我的建议是事先完全从用户名或电子邮件中删除新行,因为几乎没有合法的理由这样做。然后您可以安全地使用\A
\z
或^
$
字符串的开头和结尾不一定与行的开头和结尾相同。想象一下,如果使用以下内容作为测试字符串:
我的名称
是
安德鲁 请注意,字符串中有许多行。
^
和$
字符允许您匹配这些行的开头和结尾(基本上将\n
字符视为一个delimeter),而\a
和\Z
允许您匹配整个字符串的开头和结尾。根据:
^
匹配行的开头
$
匹配一行的结尾
\A
匹配字符串的开头
\z
匹配字符串的结尾
\Z
匹配字符串的结尾,除非字符串以“\n”
结尾,在这种情况下,它正好在“\n”
之前匹配
因此,请使用\A
和小写\z
。如果使用\Z
,可能会有人偷偷插入换行符。我认为这并不危险,但可能会破坏假定字符串中没有空格的算法。根据您的正则表达式和字符串长度限制,有人可以使用不可见的名称和换行符
JavaScript对Regex的实现将
\A
视为文本'A'
()。所以,在那里观察自己并测试。通过例子来区分差异/^foo$/
匹配下列任一项,/\Afoo\z/
不匹配:/^foo$/
和/\Afoo\z/
都符合以下条件:@Rampaanir是对的,它应该用小写字母
\z
而不是\z
+1谢谢!尽管我不得不不同意你的建议:A)如果有适当的总括,不要添加不必要的工作/处理;B)特别是如果它允许你在区分两者时保持懒散。您可能并不总是能够对字符串进行操作,而只是对正则表达式进行操作,因此请将正确的字符串提交到内存中,并了解其中的区别!我不理解带有危险内容的示例,因为在任何一种情况下,都可能在字符串中包含危险内容,无论是否有新行,这都是一个漏洞,应该通过html清理和验证加以修复。@JayrMotta演示表明,危险内容将完全绕过整个正则表达式检查。因此,即使您在正则表达式中检查危险的东西,如果您使用$
检查“字符串结束”而不是\z
,它也会被绕过。我认为这是最好的答案。“基本上将字符作为delimeter处理”确实帮助我理解,谢谢。
whatever1
foo
whatever2
foo
whatever2
whatever1
foo
foo