The Ruby %r{ } expression
Ruby on-RailsRubyRuby on-Rails Problem Overview
In a model there is a field
validates :image_file_name, :format => { :with => %r{\.(gif|jpg|jpeg|png)$}i
It looks pretty odd for me. I am aware that this is a regular expression. But I would like:
- to know what exactly it means. Is
%r{value}
equal to/value/
? - be able to replace it with normal Ruby regex operator
/some regex/
or~=
. Is it possible?
Ruby on-Rails Solutions
Solution 1 - Ruby on-Rails
%r{}
is equivalent to the /.../
notation, but allows you to have '/' in your regexp without having to escape them:
%r{/home/user}
is equivalent to:
/\/home\/user/
This is only a syntax commodity, for legibility.
Edit:
Note that you can use almost any non-alphabetic character pair instead of '{}'. These variants work just as well:
%r!/home/user!
%r'/home/user'
%r(/home/user)
Edit 2:
Note that the %r{}x
variant ignores whitespace, making complex regexps more readable. Example from GitHub's Ruby style guide:
regexp = %r{
start # some text
\s # white space char
(group) # first group
(?:alt1|alt2) # some alternation
end
}x
Solution 2 - Ruby on-Rails
With %r
, you could use any delimiters.
You could use %r{}
or %r[]
or %r!!
etc.
The benefit of using other delimeters is that you don't need to escape the /
used in normal regex literal.
Solution 3 - Ruby on-Rails
\.
=> contains a dot
(gif|jpg|jpeg|png)
=> then, either one of these extensions
$
=> the end, nothing after it
i
=> case insensitive
And it's the same as writing /\.(gif|jpg|jpeg|png)$/i
.
Solution 4 - Ruby on-Rails
this regexp matches all strings that ends with .gif, .jpg...
you could replace it with
/\.(gif|jpg|jpeg|png)$/i
Solution 5 - Ruby on-Rails
It mean that image_file_name
must end ($
) with dot and one of gif, jpg, jpeg or png.
Yes %r{}
mean exactly the same as //
but in %r{}
you don't need to escape /
.