Шаблон регулярного выражения для извлечения данных электронной почты

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

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

------Original Message------

Пример электронного письма может выглядеть так

Возвратный путь: ...
...
Дополнительные метаданные электронной почты: ...

Привет из страны регулярных выражений, я рад вас слышать.
------Исходное сообщение------
Метаданные: ...
...

Эй, чувак, регулярное выражение, можешь мне помочь? Спасибо!

С уважением, Я.

Мне нужно извлечь «Привет из страны регулярных выражений, я рад вас слышать». и любой другой текст/строки перед исходным сообщением.

Я использую это регулярное выражение прямо сейчас (С# в многострочном режиме), и оно, кажется, работает, за исключением того, что оно захватывает ------ Исходное сообщение ------, если тело пусто. Вместо этого я бы предпочел просто пустую строку.

^\s*$\n(.*)(\n------Original Message------)?

Изменить
Я никого не минусовал, и если вы проголосовали против, обычно бывает полезно включить комментарии.


person Jeff LaFay    schedule 08.09.2010    source источник


Ответы (3)


Почему бы вам не использовать DotnetOpenMail? Использование регулярного выражения для этого - неправильный подход, вместо этого вам лучше использовать специальный обработчик электронной почты....

person t0mm13b    schedule 08.09.2010
comment
Я использую клиент POP3, который мне сказали использовать, и вместо того, чтобы извлекать сообщения как объекты (как я бы предпочел), я могу извлекать только необработанный текст для каждого сообщения. В противном случае это не было бы проблемой. - person Jeff LaFay; 08.09.2010
comment
Ухх... на самом деле не имеет смысла использовать регулярное выражение для этого... какой клиент pop3 вы используете - этот клиент pop3 должен заботиться об обработке тела сообщения и т. д.... иначе регулярное выражение не понадобится !! - person t0mm13b; 08.09.2010
comment
Спасибо за попытку помочь Томми. Тогда давайте представим это в этой перспективе. У меня есть код почтового клиента PO3, и я расширяю его для создания экземпляра объекта MailMessage для каждого сообщения, полученного с POP-сервера. Теперь я пишу методы для извлечения частей необработанного текста, чтобы гидратировать свойства объекта. - person Jeff LaFay; 08.09.2010
comment
И я согласен .. все это было бы не нужно, если бы это было так :) - person Jeff LaFay; 08.09.2010
comment
tommie, я думаю, что могу требовать слишком многого от захвата регулярных выражений. Я собираюсь попробовать DotnetOpenMail. Спасибо, что указали мне правильное направление. - person Jeff LaFay; 08.09.2010

Причина этого в том, что у вас есть лишний \n внутри круглых скобок. Если тело пустое, там нет лишней новой строки. Поэтому попробуйте это:

^\s*$\r\n(.*)(^------Original Message------$)?

Если вам не нужна новая строка в конце тела, вы все равно можете использовать string.Trim() в соответствующей части.

Примечание. Это предполагает, что во входных данных используются \r\n разделителя строк (что требуется в заголовках электронной почты в соответствии со стандартом MIME).

person Timwi    schedule 08.09.2010
comment
Это дает те же результаты. - person Jeff LaFay; 08.09.2010
comment
@jlafay: Да, извини. Должно быть \r\n, а не просто \n. Обновил ответ. - person Timwi; 08.09.2010

Вам нужно заменить (\n------Original Message------) на (?=(\n------Original Message------)) вперед, чтобы не возвращать эту часть, просто чтобы убедиться, что она есть

person El Ronnoco    schedule 08.09.2010
comment
Это лучше. Проблема в том, что он не учитывает электронные письма, которые не содержат исходное сообщение. Но гораздо ближе, спасибо. - person Jeff LaFay; 08.09.2010
comment
Каковы альтернативные терминаторы, кроме original message ? - person El Ronnoco; 08.09.2010
comment
Я просто хочу, чтобы он прекратил захват перед исходной строкой сообщения. Не во всех электронных письмах будет эта строка, но в большинстве из них. Поэтому, если этой строки не существует, это новое электронное письмо, а не ответ. Я хочу, чтобы все это было захвачено. - person Jeff LaFay; 08.09.2010
comment
Кто поставил мне минус и по какой причине?! Возможно, попробуйте (?=(\n------Original Message------|$)), что должно привести вас к концу сообщения. - person El Ronnoco; 08.09.2010