在一个模型中有一个场
validates :image_file_name, :format => { :with => %r{\.(gif|jpg|jpeg|png)$}i
这看起来很奇怪。我知道这是一个正则表达式。但是我想:
%r{value}
/value/
/some regex/
=~
这个 regexp 匹配以. gif、 . jpg 结尾的所有字符串..。
你可以把它换成
/\.(gif|jpg|jpeg|png)$/i
\. = > 包含一个点 那么,这两个扩展中的任何一个 结束后就没有了 i = > 不区分大小写
\.
i
这和写 /\.(gif|jpg|jpeg|png)$/i是一样的。
这意味着 image_file_name必须以点结束($) ,以 gif、 jpg、 jpeg 或 png 结束。
image_file_name
$
是的,%r{}的意思和 //完全一样,但是在 %r{}中你不需要逃逸 /。
%r{}
//
/
%r{}等效于 /.../符号,但允许在 regexp 中使用“/”而不必转义它们:
/.../
%r{/home/user}
等同于:
/\/home\/user/
出于易读性考虑,这只是一种语法商品。
编辑:
请注意,几乎可以使用任何非字母字符对来代替“{}”。 这些变体同样有效:
%r!/home/user! %r'/home/user' %r(/home/user)
编辑2:
请注意,%r{}x变体忽略了空格,这使得复杂的 regexp 更易读:
%r{}x
regexp = %r{ start # some text \s # white space char (group) # first group (?:alt1|alt2) # some alternation end }x
对于 %r,您可以使用任何分隔符。
%r
你可以使用 %r{}或者 %r[]或者 %r!!等等。
%r[]
%r!!
使用其他分隔符的好处是不需要转义常规正则表达式文字中使用的 /。