Ruby%r {}expression式

在模型中有一个领域

validates :image_file_name, :format => { :with => %r{\.(gif|jpg|jpeg|png)$}i 

这对我来说很奇怪。 我知道这是一个正则expression式。 但是我想:

  • 知道究竟是什么意思。 %r{value}等于/value/
  • 能够用普通的Ruby正则expression式运算符/some regex/~=replace它。 可能吗?

%r{}相当于/.../表示法,但是可以在你的正则expression式中使用'/'而不必转义它们:

 %r{/home/user} 

相当于:

 /\/home\/user/ 

这只是一个语法商品,易于理解。

编辑:

请注意,您几乎可以使用任何非字母字符对,而不是“{}”。 这些变体同样适用:

 %r!/home/user! %r'/home/user' %r(/home/user) 

\. =>包含一个点
(gif|jpg|jpeg|png) =>然后,这些扩展名中的任何一个
$ =>结束,没有任何事情
i =>不区分大小写

和写作/\.(gif|jpg|jpeg|png)$/i

%r ,你可以使用任何分隔符。

您可以使用%r{}%r[]%r!! 等等

使用其他的delimeters的好处是,你不需要逃避/使用正常的正则expression式文字。

这个正则expression式匹配以.gif,.jpg结尾的所有string…

你可以用它来replace它

 /\.(gif|jpg|jpeg|png)$/i 

这意味着image_file_name必须以点(gif,jpg,jpeg或png)结尾( $ )。

%r{}含义与//完全相同,但在%r{}您不需要转义/