Ruby on rails Ruby%r{}表达式

Ruby on rails Ruby%r{}表达式,ruby-on-rails,ruby,Ruby On Rails,Ruby,在模型中有一个字段 validates :image_file_name, :format => { :with => %r{\.(gif|jpg|jpeg|png)$}i 我觉得很奇怪。我知道这是一个正则表达式。但我想: 知道它的确切含义。%r{value}等于/value/ 可以用普通的Ruby正则表达式操作符替换它/some regex/或~=。可能吗 此regexp匹配以.gif、.jpg结尾的所有字符串 你可以换成 /\.(gif|jpg|jpeg|png)$/i \

在模型中有一个字段

validates :image_file_name, :format => { :with => %r{\.(gif|jpg|jpeg|png)$}i
我觉得很奇怪。我知道这是一个正则表达式。但我想:

  • 知道它的确切含义。
    %r{value}
    等于
    /value/
  • 可以用普通的Ruby正则表达式操作符替换它
    /some regex/
    ~=
    。可能吗

此regexp匹配以.gif、.jpg结尾的所有字符串

你可以换成

/\.(gif|jpg|jpeg|png)$/i

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


这和写
/\(gif | jpg | jpeg | png)$/i

是一样的,这意味着
图像文件名
必须以点和gif、jpg、jpeg或png中的一个结尾(
$


是的
%r{}
的意思与
/
完全相同,但是在
%r{}
中,您不需要转义
/

%r{}
等同于
/…/
符号,但允许您在regexp中有“/”而无需转义:

%r{/home/user}
相当于:

/\/home\/user/
为了便于阅读,这只是一种语法商品

编辑:

请注意,您几乎可以使用任何非字母字符对而不是“{}”。 这些变体也同样适用:

%r!/home/user!
%r'/home/user'
%r(/home/user)
编辑2:

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

regexp=%r{
开始#一些文本
\s#空白字符
(组)#第一组
(?:alt1 | alt2)#一些替换
结束
}x

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

您可以使用
%r{}
%r[]
%r


使用其他delimeter的好处是,您不需要转义在普通正则表达式文本中使用的
/

是%r{value}等于/value/?是的,它是相同的。-例如,
%w[123]
[1,2,3]
相同。
%w[123]
[1,2,3]
不同。它与
['1','2','3']
@JörgWMittag相同,感谢您的更正。否决票仅在1小时前。至于将空格作为分隔符,这是非常棒的,但我不建议您在六个月后阅读代码而不感到困惑:)如果您使用空格作为分隔符,那么如果您稍后在正则表达式中添加空格,它将崩溃。我认为这样做的目的是使用与正则表达式中的任何内容都不匹配的分隔符,并将大括号作为首选默认值。这几乎就像ruby设计用于编写尽可能糟糕的代码一样。我不理解第二次编辑的注释。
%r{}x
有什么特别之处
/…/x
也会忽略空白。这不是
%r
语法的特殊属性。可以跟随
/../
的所有选项也可以跟随
%r{}