150

在模型中有一个字段

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

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

  • 知道它到底是什么意思。%r{value}等于/value/? _
  • 能够用普通的 Ruby 正则表达式运算符/some regex/~=. 可能吗?
4

5 回答 5

288

%r{}等效于/.../符号,但允许您在正则表达式中包含 '/' 而不必转义它们:

%r{/home/user}

相当于:

/\/home\/user/

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

编辑:

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

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

编辑2:

请注意,该%r{}x变体忽略空格,使复杂的正则表达式更具可读性。来自GitHub 的 Ruby 风格指南的示例:

regexp = %r{
  start         # some text
  \s            # white space char
  (group)       # first group
  (?:alt1|alt2) # some alternation
  end
}x
于 2012-09-12T09:10:22.250 回答
11

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

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

使用其他分隔符的好处是您不需要转义/在普通正则表达式中使用的文字。

于 2012-09-12T09:15:17.363 回答
9

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

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

于 2012-09-12T09:09:40.557 回答
3

此正则表达式匹配所有以 .gif、.jpg... 结尾的字符串

你可以用

/\.(gif|jpg|jpeg|png)$/i
于 2012-09-12T09:08:35.103 回答
1

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

%r{}的意思完全一样,//%r{}你不需要逃避/

于 2012-09-12T09:10:21.140 回答