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

col*_*rco 185 ruby regex

在我阅读的文档中:

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

我将应用正则表达式来检查用户提交的用户名(或电子邮件是否相同).我应该validates_format_of在模型中使用哪个表达式?我无法理解其中的区别:我一直用^和$ ...

Luk*_*uke 211

如果您依赖于正则表达式进行验证,那么您总是希望使用\A\z.^并且$只会匹配到换行符,这意味着他们可以使用类似的电子邮件me@example.com\n<script>dangerous_stuff();</script>并且仍然可以验证,因为正则表达式只能看到之前的所有内容\n.

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

  • @Ragmaanir是对的,它应该是小写字母`\ z`而不是`\ Z`! (12认同)
  • +1谢谢!虽然我不得不反对你的建议:A)如果有适当的全部内容,不要添加不必要的工作/处理,B)特别是如果它允许你在区分两者之间保持懒惰的话.您可能并不总是能够进行字符串操作,只能使用Regex,因此请将正确的操作提交给内存并了解其中的区别! (8认同)
  • 我不理解带有危险内容的示例,因为在任何一种情况下,都可能在字符串中包含危险内容,无论是否有新行,这都将是一种漏洞,应该通过 html 清理和验证来修复。 (2认同)
  • @JayrMotta 演示表明,危险的东西会*完全绕过整个正则表达式检查*。因此,即使您正在检查正则表达式中的危险内容,如果您使用 `$` 来检查“字符串结尾”而不是 `\z`,它也会被绕过。 (2认同)

Rag*_*nir 169

Pickaxe说:

^ 匹配一行的开头.

$ 匹配一行的结尾.

\A 匹配字符串的开头.

\z 匹配字符串的结尾.

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

所以,使用\A和小写\z.如果你使用\Z某人可以潜入一个换行符.我认为这并不危险,但可能搞砸假设字符串中没有空格的算法.根据你的正则表达式和字符串长度限制,有人可以使用一个只有换行符的隐形名称.

JavaScript的Regex实现视为\A文字'A'(ref).所以看看自己在那里测试.

  • +1链接到一些参考资料(即使你确实出现了几年后:) (14认同)

And*_*are 15

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

我的
名字

安德鲁

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


Chu*_*ang 9

差异示例

  1. /^foo$/匹配以下任何一项,/\Afoo\z/不符合:
whatever1
foo
whatever2
Run Code Online (Sandbox Code Playgroud)
foo
whatever2
Run Code Online (Sandbox Code Playgroud)
whatever1
foo
Run Code Online (Sandbox Code Playgroud)
  1. /^foo$/并且/\Afoo\z/所有符合以下内容:
foo
Run Code Online (Sandbox Code Playgroud)