在模型中有一个字段
validates :image_file_name, :format => { :with => %r{\.(gif|jpg|jpeg|png)$}i
对我来说这看起来很奇怪。我知道这是一个正则表达式。但我想:
- 知道它到底是什么意思。
%r{value}
等于/value/
? _ - 能够用普通的 Ruby 正则表达式运算符
/some regex/
或~=
. 可能吗?
在模型中有一个字段
validates :image_file_name, :format => { :with => %r{\.(gif|jpg|jpeg|png)$}i
对我来说这看起来很奇怪。我知道这是一个正则表达式。但我想:
%r{value}
等于/value/
? _/some regex/
或~=
. 可能吗?%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
使用%r
,您可以使用任何分隔符。
您可以使用%r{}
or %r[]
or%r!!
等。
使用其他分隔符的好处是您不需要转义/
在普通正则表达式中使用的文字。
\.
=> 包含一个点
(gif|jpg|jpeg|png)
=> 然后,这些扩展中的任何一个
$
=> 结尾,之后什么都没有
i
=> 不区分大小写
这和写作一样/\.(gif|jpg|jpeg|png)$/i
。
此正则表达式匹配所有以 .gif、.jpg... 结尾的字符串
你可以用
/\.(gif|jpg|jpeg|png)$/i
这意味着必须以点和 gif、jpg、jpeg 或 png 之一image_file_name
结束 ( )。$
是%r{}
的意思完全一样,//
但%r{}
你不需要逃避/
。