Выражение Ruby% r {}

В модели есть поле

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

Это выглядит довольно странно для меня. Я знаю, что это регулярное выражение. Но я бы хотел:

  • знать, что именно это означает. Является ли %r{value} равным /value/?
  • сможет заменить его обычным оператором регулярного выражения Ruby /some regex/ или ~=. Возможно ли это?

Ответ 1

%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

Ответ 2

\. = > содержит точку (gif|jpg|jpeg|png) = > , то либо одно из этих расширений $ = > конец, ничего после него
i = > нечувствительность к регистру

И это то же самое, что писать /\.(gif|jpg|jpeg|png)$/i.

Ответ 3

С помощью %r вы можете использовать любые разделители.

Вы можете использовать %r{} или %r[] или %r!! и т.д.

Преимущество использования других разделителей заключается в том, что вам не нужно избегать /, используемых в нормальном регулярном выражении.

Ответ 4

это регулярное выражение соответствует всем строкам, которые заканчиваются на .gif,.jpg...

вы можете заменить его на

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

Ответ 5

Это означает, что image_file_name должен заканчиваться ($) точкой и одним из gif, jpg, jpeg или png.

Да %r{} означает то же самое, что и //, но в %r{} вам не нужно бежать /.