The Ruby %r{ } expression

Ruby on-RailsRuby

Ruby 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 /.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlexandreView Question on Stackoverflow
Solution 1 - Ruby on-RailsEurekaView Answer on Stackoverflow
Solution 2 - Ruby on-RailsxdazzView Answer on Stackoverflow
Solution 3 - Ruby on-RailsSamy DindaneView Answer on Stackoverflow
Solution 4 - Ruby on-RailsErez RabihView Answer on Stackoverflow
Solution 5 - Ruby on-RailsHaulethView Answer on Stackoverflow