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