Ruby%r {}表达式

Ale*_*dre 129 ruby ruby-on-rails

在模型中有一个字段

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

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

  • 要知道它究竟意味着什么.是%r{value}等于/value/
  • 能够与一般的Ruby正则表达式运算符来取代它/some regex/~=.可能吗?

Eur*_*eka 249

%r{}相当于/.../符号,但允许你在正则表达式中使用'/'而不必转义它们:

%r{/home/user}
Run Code Online (Sandbox Code Playgroud)

相当于:

/\/home\/user/
Run Code Online (Sandbox Code Playgroud)

这只是一种语法商品,易读性.

编辑:

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

%r!/home/user!
%r'/home/user'
%r(/home/user)
Run Code Online (Sandbox Code Playgroud)

  • 甚至`re =%r/home/user`也可以(空格作为分隔符). (24认同)
  • downvote仅在1小时前.至于空间作为分隔符,这是很棒的,但不是我希望能够阅读你的代码而不是六个月后感到困惑的那种东西:) (5认同)
  • 如果使用空格作为分隔符,则在以后向其添加空格时,正则表达式将会中断.我认为这个想法是使用与正则表达式中的任何内容都不匹配的分隔符,并使用花括号作为首选默认值. (3认同)

Sam*_*ane 9

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

它和写作一样/\.(gif|jpg|jpeg|png)$/i.

  • `%w [1 2 3]`*与*[1,2,3]`不相同.它与`['1','2','3']相同. (6认同)

xda*_*azz 8

有了%r,你可以使用任何分隔符.

你可以使用%r{}%r[]%r!!等.

使用其他分隔符的好处是您不需要/在正常的正则表达式文字中使用它.

  • 它与`%r {}`相同 (3认同)