Розбийте регулярний вираз Ruby на кілька рядків


82

Це може бути не зовсім питання, яке ви очікуєте! Я не хочу регулярного виразу, який збігатиметься при розривах рядків; натомість я хочу написати довгий регулярний вираз, який для читабельності я хотів би розділити на кілька рядків коду.

Щось на зразок:

"bar" =~ /(foo|
           bar)/  # Doesn't work!
# => nil. Would like => 0

Чи можна це зробити?

Відповіді:


52

Вам потрібно використовувати /xмодифікатор, який включає режим вільного інтервалу .

У вашому випадку:

"bar" =~ /(foo|
           bar)/x

48
Цю відповідь можна покращити, замінивши посилання на більш детальне пояснення.
mkataja

Ось так:regexp = /(\d+)(\d+)/x
Еван Росс

126

Використання% r з параметром x є найкращим способом зробити це.

Див. Цей приклад із посібника стилю github ruby

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

regexp.match? "start groupalt2end"

https://github.com/github/rubocop-github/blob/master/STYLEGUIDE.md#regular-expressions


5
Приклад для наслідування. Коментарі всередині регулярного виразу роблять чудеса щодо ремонтопридатності.
Пол Кантрелл,

8
Або з / замість% r, оскільки rubocop скаржиться, якщо регулярний вираз не знаходиться між косими рисками. Також їх керівництво по стилю, яке рекомендує це так: github.com/bbatsov/ruby-style-guide#regular-expressions
ytg

3

Ви можете використовувати:

"bar" =~ /(?x)foo|
         bar/

8
Ця відповідь була корисною для моєї ситуації, але лише після того, як я шукав, що означає (? X), і зміг додати більше контексту. Було б непогано, якби ця відповідь була оновлена, щоб бути більш чітким щодо того, що вона ілюструє. Для інших зацікавлених я знайшов тут примітки про конструкцію (? On
Бен

@BenParizek Можливо, ви можете додати тут коротке пояснення як коментар?
Пітер Берг,

Я не фахівець з цієї теми, але, наскільки я розумію, більшість відповідей тут говорять про різні версії одного і того ж. Проблема полягає в тому, що складні регулярні вирази важко читати. Загальна відповідь така: ви можете ввімкнути режим вільного інтервалу, щоб зробити регулярні вирази більш читабельними. Існує кілька способів увімкнути режим вільного інтервалу. 1) Ви можете додати модифікатор після кінцевого роздільника /myregex/x, 2) Ви можете перемикати режим вільного інтервалу, використовуючи конструкцію (? On-off) /myregex(?x) with free spacing/, 3) Ви можете використовувати %r{myregex}xсинтаксис.
Бен Парізек,

1

Замість того, щоб розрізати середній вираз регулярного виразу, я пропоную розбити його на частини:

full_rgx = /This is a message\. A phone number: \d{10}\. A timestamp: \d*?/

msg = /This is a message\./
phone = /A phone number: \d{10}\./
tstamp = /A timestamp: \d*?/

/#{msg} #{phone} #{tstamp}/

Я роблю те саме для довгих струн.


Я відповів з цією відповіддю на інші, рекомендуючи /xмодифікатор, тому що мені довелося б посипати \sскрізь. Розпад регулярного виразу було набагато швидшим і, можливо, легшим для читання та обслуговування.
agressen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.