Ищете идеи о том, как соответствовать шаблону, возможно или нет? - PullRequest
1 голос
/ 18 ноября 2010

Мне нужна помощь в создании соответствия шаблонов для приема электронных писем.Конечной целью является получение входящего сообщения и извлечение только ответного сообщения, а не всего конечного мусора (предыдущие темы, подпись, заголовок метки данных и т. Д.)

Вот два одинаковых формата:

Формат 1:

The Message is here, etc etc can span a random # of lines

On Nov 17, 2010, at 4:18 PM, Person Name wrote:

lots of junk down here which we don't want

Формат 2:

The Message is here, etc etc can span a random # of lines

On Nov 17, 2010, at 4:18 PM, Site <yadaaaa+adad@sitename.com> wrote:

lots of junk down here which we don't want

Формат 3:

The Message is here, etc etc can span a random # of lines

On Fri, Nov 19, 2010 at 1:57 AM, <customerserviceonline@pge.com> wrote:

lots of junk down here which we don't want

Для обоих приведенных выше примеров я хотел бы создать сопоставление с шаблоном, которое находит первый экземпляр 2-й строки.И затем возвращает только то, что выше этой строки.Я не хочу эту разделительную линию.

Я не могу сопоставить отметку с датой, но могу сопоставить все, что находится после запятой, так как это в моем распоряжении.

Итак, идея: поиск любого из этих двух статических элементов:

, Site <yadaaaa+adad@sitename.com> wrote:
, Person Name wrote:

И затем возьми все выше этой позиции.Как вы думаете.Это возможно?

Ответы [ 3 ]

2 голосов
/ 18 ноября 2010

я бы добавил другой подход: почему вы не читаете все и не ломаетесь, когда вы соответствуете строке, которая у вас есть как стоп?

1 голос
/ 19 ноября 2010

Ну, это будет решение регулярного выражения:

/(On (?:(?:Sun|Mon|Tues|Wed|Thurs|Fri|Sat), |)(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2}, [12]\d{3}(?:|,) at \d{1,2}:\d{1,2} (?:AM|PM), (?:(?:Site |)<[\w.%+-]+@[\w.-]+\.[A-Za-z]{2,4}>|Person \w+) wrote:)/

Вы только что предоставили один пример, так что он может быть не идеальным, но он должен хорошо выполнять свою работу.

Затем вы должны получить первую захваченную группу с $ 1 или [0], если вы используете match:)

regex =  /(On (?:(?:Sun|Mon|Tues|Wed|Thurs|Fri|Sat), |)(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2}, [12]\d{3}(?:|,) at \d{1,2}:\d{1,2} (?:AM|PM), (?:(?:Site |)<[\w.%+-]+@[\w.-]+\.[A-Za-z]{2,4}>|Person \w+) wrote:)/

if str =~ regex
  puts "S1 : #{$1}"
end

if res = str.match(regex)
  puts "S2 : #{res[0]}"
end

Кстати, вы можете использовать опцию /i в регулярном выражении.

1 голос
/ 19 ноября 2010

Это не очень хорошее применение для регулярных выражений, если вы пытаетесь сделать все это в одном паттерне. Это можно сделать, но я подозреваю, что вселенная остынет, прежде чем вы исправите все ошибки.

Чтобы понять суть того, что вы пытаетесь сделать, прочитайте статью в Википедии "Стиль публикации" . Существует много разных способов, которыми ответы встраиваются в сообщение электронной почты, частично контролируемые 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
# >> 

Шаблон может быть проще, но если бы это было так, это увеличило бы вероятность возврата ложных срабатываний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...