Regex - соответствие в Rubular, но не в Ruby
Данный текст как:
body =
yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada yada
< via mobile device >
Yada Yada <xxxxx@xxxxx.com> wrote:
yada yada yada yada yada yada yada yada yada
Я хочу соответствовать второму абзацу, поэтому я делаю:
body = body.split(/.* <xxxxx@xxxxx.com> wrote: .*/m).first
Но в ruby это не соответствует, хотя в Rubular. Есть идеи почему? Спасибо
2 ответа
Попробуйте это вместо этого:
body = body.split(/.*<xxxxx@xxxxx.com> wrote:.*/).first
Пространство после первого .*
был бесполезен, и (как указал @aef) пространство перед вторым .*
был ошибочным (возможно, в вашем рубулярном тесте было место).
Обратите внимание, что я удалил m
модификатор тоже. Если бы я этого не сделал, регулярное выражение соответствовало бы всей строке, что привело бы к пустому массиву. Вот что Ruby называет многострочным режимом (а все остальные называют однострочным или многоточечным режимом): .
соответствует всему, включая переводы строк.
РЕДАКТИРОВАТЬ: увидеть его на ideone.com
Линия
Yada Yada <xxxxx@xxxxx.com> wrote:
заканчивается переводом строки, а не пробелом. Итак, ваше регулярное выражение должно быть:
/.* <xxxxx@xxxxx.com> wrote:\n.*/m
Внимание: системы Windows и некоторые протоколы, такие как HTML, могут использовать разные кодировки перевода строки. Если вы хотите быть уверенным в совместимости, сначала преобразуйте входные данные в кодировку перевода строки Unix, а затем выполните извлечение данных. Вы можете использовать мой драгоценный камень для перевода строки.