Выражение 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{}
вам не нужно бежать /
.