Ruby% r {}表达式

在一个模型中有一个场

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

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

  • 知道它到底是什么意思。 %r{value}等于 /value/吗?
  • 可以用普通的 Ruby regex 操作符 /some regex/=~替换它。这可能吗?
62608 次浏览

这个 regexp 匹配以. gif、 . jpg 结尾的所有字符串..。

你可以把它换成

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

\. = > 包含一个点
那么,这两个扩展中的任何一个
结束后就没有了
i = > 不区分大小写

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

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

是的,%r{}的意思和 //完全一样,但是在 %r{}中你不需要逃逸 /

%r{}等效于 /.../符号,但允许在 regexp 中使用“/”而不必转义它们:

%r{/home/user}

等同于:

/\/home\/user/

出于易读性考虑,这只是一种语法商品。

编辑:

请注意,几乎可以使用任何非字母字符对来代替“{}”。 这些变体同样有效:

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

编辑2:

请注意,%r{}x变体忽略了空格,这使得复杂的 regexp 更易读:

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

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

你可以使用 %r{}或者 %r[]或者 %r!!等等。

使用其他分隔符的好处是不需要转义常规正则表达式文字中使用的 /