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, а затем выполните извлечение данных. Вы можете использовать мой драгоценный камень для перевода строки.

Другие вопросы по тегам