Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby正则表达式中\A\z和^$之间的差异_Ruby_Regex - Fatal编程技术网

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

Ruby正则表达式中\A\z和^$之间的差异,ruby,regex,Ruby,Regex,在我阅读的文档中: 使用\A和\z匹配字符串的开头和结尾,^和$匹配行的开头/结尾 我将应用一个正则表达式来检查用户提交的用户名(或者电子邮件是相同的)。我应该使用哪个表达式来验证模型中的格式?我无法理解其中的区别:我一直使用^and$…如果您依赖正则表达式进行验证,那么您总是希望使用\A和\z^和$将只匹配到换行符,这意味着他们可以使用类似me@example.com\大量的东西

在我阅读的文档中:

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


我将应用一个正则表达式来检查用户提交的用户名(或者电子邮件是相同的)。我应该使用哪个表达式来验证模型中的格式?我无法理解其中的区别:我一直使用^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