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

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

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

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

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

Обратный путь:...
...
Больше метаданных электронной почты:...

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

Привет, чувак, ты можешь мне помочь? Спасибо!

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

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

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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