Вираз Ruby% r {}


131

У моделі є поле

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

Для мене це виглядає досить дивно. Я знаю, що це регулярний вираз. Але я хотів би:

  • знати, що саме це означає. Є чи %r{value}одно /value/?
  • бути в змозі замінити його на звичайний оператор регулярних виразів Ruby /some regex/або ~=. Це можливо?

Відповіді:


254

%r{}еквівалентно /.../позначенням, але дозволяє мати "/" у своєму регулярному виразі, не виходячи з них:

%r{/home/user}

еквівалентно:

/\/home\/user/

Це лише товар синтаксису, для розбірливості.

Редагувати:

Зауважте, що ви можете використовувати майже будь-яку не алфавітну пару символів замість "{}". Ці варіанти працюють так само добре:

%r!/home/user!
%r'/home/user'
%r(/home/user)

Редагувати 2:

Зауважте, що %r{}xваріант ігнорує пробіли, роблячи складні регулярні виразки більш читабельними. Приклад із посібника зі стилю Ruby GitHub :

regexp = %r{
  start         # some text
  \s            # white space char
  (group)       # first group
  (?:alt1|alt2) # some alternation
  end
}x

5
Зниження було лише 1 годину тому. Що стосується простору як роздільника, то це приголомшливо, але не таке, що я рекомендую вам мати можливість читати ваш код, не збиваючись з пантелику через півроку :)
Eureka,

3
Якщо ви використовуєте пробіли як роздільник, ваш регулярний вираз порушиться, якщо ви додасте пробіли пізніше. Я думаю, що ідея полягає у використанні роздільників, які не відповідають нічого у вашому звичайному виразі, з фігурними дужками як кращим за замовчуванням.
Стівен Гірлстон

1
Це майже так, якби рубін був розроблений для написання якомога жахливішого коду
Роман

Не розумію ноти другого редагування. Що особливого %r{}x? /.../xтакож ігнорує пробіли. Це не особлива властивість %rсинтаксису. Усі параметри, які можуть слідувати, /../також можуть слідувати %r{}.
Mecki

9

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

І це те саме, що писати /\.(gif|jpg|jpeg|png)$/i.


Чи дорівнює% r {value} рівню / value /?
Олександр

Так, це те саме. - Як %w[1 2 3]те саме, що, [1, 2, 3]наприклад.
Самі Діндан

6
%w[1 2 3]це НЕ те ж саме , як [1, 2, 3]. Це те саме, що ['1', '2', '3'].
Йорг W Міттаг

@ JörgWMittag Дякую за виправлення
Самі Діндан

9

З %r, ви можете використовувати будь-які роздільники.

Ви можете використовувати %r{}або %r[]і %r!!т.д.

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


3

це регулярне вираження відповідає всім рядкам, які закінчуються .gif, .jpg ...

ви можете замінити його

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

1

Це означає, що image_file_nameмає закінчуватися $крапкою ( ) і крапкою з gif, jpg, jpeg або png.

Так, %r{}означає точно так само, як //у %r{}вас, але вам не потрібно бігти /.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.