Это не очень хорошее применение для регулярных выражений, если вы пытаетесь сделать все это в одном паттерне. Это можно сделать, но я подозреваю, что вселенная остынет, прежде чем вы исправите все ошибки.
Чтобы понять суть того, что вы пытаетесь сделать, прочитайте статью в Википедии "Стиль публикации" . Существует много разных способов, которыми ответы встраиваются в сообщение электронной почты, частично контролируемые MUA (почтовым агентом пользователя) и частично человеком, который делает ответ. Не существует установленного метода выполнения атрибуции, и нет правила, гласящего, что ответ находится в одном блоке на странице или в верхней части страницы. Это означает, что любой код, который вы пишете, должен быть очень сложным, чтобы иметь возможность работать последовательно.
Вы смотрели на Mail
? Это уже написано, хорошо проверено, у него есть все виды классных наворотов, и это уже написано. (Я сказал это снова, потому что заново изобретать колеса, которые работают хорошо, может быть очень больно.)
Разбор простого текстового электронного письма - одна из задач. Затем есть MIME-кодированное письмо с разными типами контента. Кроме того, есть электронная почта «HTML», в которой нет блоков MIME, но какой-то придурок просто решил, что всем нравится форматирование HTML и мигающий текст. Кроме того, существуют различные странно разбитые типы тел сообщений с четырьмя типами цитирования ответов и полным содержанием всех предыдущих сообщений, добавленных одно под другим, и подписи ужасно разочарованных писателей-любителей, которые включают весь текст моей любимой книги ». Девушка, чтобы схватить ", AKA Vol. 5 Энциклопедия Британника. Mail
может помочь вам избавиться от всего мусора, предоставив вам хороший шанс получить нужный вам контент.
Чтобы получить диапазон текста в теле, посмотрите на оператор Ruby ..
(AKA "триггер"). Он предназначен для возврата логического true / false, когда происходят два разных теста. Смотрите " Когда будет полезен триггер Ruby? "
Как правило, вы бы построили его так:
if ((string =~ /pattern1/) .. (string =~ /pattern2/))
...
end
По мере обработки, если первый тест совпадает с чем-то, последующие циклы попадают в блок if
. Когда будет найдено окончание теста, блок будет отключен для последующих циклов. В этом случае вы захотите использовать строковый литерал или небольшое регулярное выражение, чтобы найти начальную и конечную строки. Если у вас есть шанс увидеть начальный шаблон в последующем тексте, вам придется выяснить, как его перехватить.
Например, вот способ получить некоторый контент, который соответствует вашим заявленным требованиям, если кто-то делает топ-ответ:
msg = <<EOT
The Message is here, etc etc can span a random # of lines
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
On Nov 17, 2010, at 4:18 PM, Person Name wrote:
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
EOT
body = []
msg.lines.each do |li|
li.chomp!
body << li
break if (li =~ /^On (\S+ )*\w+ \d+, \d+, at [\d:]+ \w+, .+ wrote:/i)
end
puts body[0 .. -2]
puts '=' * 40
msg = <<EOT
The Message is here, etc etc can span a random # of lines
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
On Nov 17, 2010, at 4:18 PM, Site <yadaaaa+adad@sitename.com> wrote:
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
EOT
body = []
msg.lines.each do |li|
li.chomp!
body << li
break if (li =~ /^On (\S+ )*\w+ \d+, \d+, at [\d:]+ \w+, .+ wrote:/i)
end
puts body[0 .. -2]
А вот и вывод:
# >> The Message is here, etc etc can span a random # of lines
# >> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
# >>
# >> ========================================
# >> The Message is here, etc etc can span a random # of lines
# >> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
# >>
Шаблон может быть проще, но если бы это было так, это увеличило бы вероятность возврата ложных срабатываний.