ruby正则表达式中^,$和\ A,\ Z之间的区别

时间:2014-04-10 17:18:38

标签: ruby regex

^ - Matches beginning of line

$ - Matches end of line

\A - Matches beginning of string.

\Z - Matches end of string. If string ends with a newline, it matches just before 

前两名和后两名有什么区别?你什么时候使用一个而不是另一个?我没有看到它。

2 个答案:

答案 0 :(得分:9)

您可以拥有一个多行字符串,其中\A\Z变得重要:

s = "this\ntest"
# => "this\ntest"

s.match(/^this$/)
# => <MatchData "this">

s.match(/\Athis\Z/)
# => nil

有时候验证\A\Z 强制要求的用户数据。例如:

if (site.match(%r[^http://sitename.com/$]))
  # ...
end

在这种情况下,可以围绕提供"http://sitename.com/\nhttp://evil.com/"作为站点字符串来构建攻击。

答案 1 :(得分:2)

<强>更新

很抱歉没有习惯Ruby,但Ruby的正则表达式默认似乎有一个多行修饰符。因此,在我的下面的示例/描述中,无论是否使用修饰符,它们总是会有所不同。 Ruby中的m修饰符只会改变.与新行匹配的事实。


^\A都使用相同的,除非使用m多行修饰符。然后,^将匹配每行的开头,而\A将继续匹配整个字符串的开头。

同样适用于$\Z。使用多行修饰符,$将匹配每行的结尾,而\Z将继续匹配整个字符串的结尾。


<强>示例:

我将使用重复的字符串abc,其他字符表示匹配的位置,而不是字符串中的实际字符。

没有多行:

\A^abc
   abc
   abc$\Z

使用多行:

\A^abc$
  ^abc$
  ^abc$\Z