Ruby%r {}表达式


131

在模型中有一个领域

validates :image_file_name, :format => { :with => %r{\.(gif|jpg|jpeg|png)$}i

对我来说看起来很奇怪。我知道这是一个正则表达式。但我想:

  • 知道到底是什么意思。是%r{value}等于/value/
  • 能够用普通的Ruby regex运算符/some regex/或替换它~=。可能吗?

Answers:


254

%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

5
投票只有1小时前。至于作为分隔符的空间,这很棒,但是我不建议您能够在六个月后不感到困惑的情况下读取您的代码:)
Eureka 2012年

3
如果将空格用作定界符,则以后再添加空格时,正则表达式将中断。我认为,这种想法是使用与正则表达式中的任何内容都不匹配的定界符,并使用花括号作为首选默认值。
史蒂文·希尔斯顿

1
几乎就好像红宝石被设计成编写尽可能可怕的代码一样
罗马

不了解您第二次编辑的注意事项。有什么特别之处%r{}x/.../x也忽略空格。这不是%r语法的特殊属性。所有可以遵循的选项也可以/../遵循%r{}
梅基

9

\.=>包含一个点
(gif|jpg|jpeg|png)=>然后,这些扩展名之一
$=>结尾,后面没有任何内容
i=>不区分大小写

它与写作相同/\.(gif|jpg|jpeg|png)$/i


%r {value}是否等于/ value /?
亚历山大

是的,是一样的。- %w[1 2 3][1, 2, 3]例如相同。
Samy Dindane 2012年

6
%w[1 2 3]一样的[1, 2, 3]。与相同['1', '2', '3']
约尔格W¯¯米塔格

@JörgWMittag感谢您的纠正。
Samy Dindane 2012年

9

使用%r,您可以使用任何定界符。

您可以使用%r{}%r[]或其他方式%r!!

使用其他分隔符的好处是,您无需转义/普通正则表达式文字中使用的分隔符。



1

这意味着image_file_name必须$以点和gif,jpg,jpeg或png之一结尾()。

是的%r{}意思和完全一样,//但是%r{}你不需要逃脱/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.