The Ruby %r{ } expression



在模型中有一个字段

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

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

  • 知道它到底意味着什么。%r{value}等于/value/
  • 能够用普通Ruby正则表达式运算符CCD_ 3或CCD_。这可能吗

%r{}等效于/.../表示法,但允许您在正则表达式中使用"/",而不必转义它们:

%r{/home/user}

相当于:

//home/user/

为了易读性,这只是一个语法商品。

编辑:

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

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

编辑2:

请注意,%r{}x变体忽略空白,使复杂的regexp更具可读性。GitHub Ruby风格指南示例:

regexp = %r{
  start         # some text
  s            # white space char
  (group)       # first group
  (?:alt1|alt2) # some alternation
  end
}x

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

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

使用其他delimeter的好处是不需要转义普通regex文本中使用的/

.=>包含一个点
(gif|jpg|jpeg|png)=>那么,这些扩展中的任意一个
$=>结束后什么都没有
i=>不区分大小写的

这和写/.(gif|jpg|jpeg|png)$/i是一样的。

此regexp匹配所有以.gif、.jpg…结尾的字符串

你可以用代替它

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

这意味着image_file_name必须以句点和gif、jpg、jpeg或png中的一个结尾($)。

是的,%r{}的含义与//完全相同,但在%r{}中,您不需要逃离/

最新更新