在模型中有一个字段
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{}你不需要逃避/。