Regex - соответствие в Rubular, но не в Ruby - PullRequest
0 голосов
/ 05 марта 2011

Данный текст похож на:

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 ]

1 голос
/ 05 марта 2011

Попробуйте вместо этого:

body = body.split(/.*<xxxxx@xxxxx.com> wrote:.*/).first

Пробел после первой .* был бесполезен, и (как указал @aef) пробел до секунды .* был ошибочным (возможно, там был пробел в вашем рубулярном тесте) .

Обратите внимание, что я также удалил модификатор m. Если бы я этого не сделал, регулярное выражение сопоставило бы всю строку, что привело бы к пустому массиву. Это то, что Руби называет режимом многострочный (и все остальные называют режим однострочный или точка-все ): . соответствует всему , включая переводы строк.

РЕДАКТИРОВАТЬ: Посмотреть на ideone.com

1 голос
/ 05 марта 2011

Линия

Yada Yada <xxxxx@xxxxx.com> wrote:

заканчивается переводом строки, а не пробелом. Итак, ваше регулярное выражение должно быть:

/.* <xxxxx@xxxxx.com> wrote:\n.*/m

Внимание: системы Windows и некоторые протоколы, такие как HTML, могут использовать разные кодировки перевода строки. Если вы хотите быть совместимым, сначала преобразуйте входные данные в кодировку перевода строки Unix, а затем выполните извлечение данных. Для этого вы можете использовать мой камень перевода строки .

...