Лучший способ разобрать строку адресов электронной почты - PullRequest
10 голосов
/ 16 января 2009

Итак, я работаю с некоторыми данными заголовка электронной почты, а для полей to :, from :, cc: и bcc: адрес (а) электронной почты можно выразить различными способами:

First Last <name@domain.com>
Last, First <name@domain.com>
name@domain.com

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

First, Last <name@domain.com>, name@domain.com, First Last <name@domain.com>

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

Может кто-нибудь предложить лучший способ сделать это?

Я пытался разделить запятые, что сработало бы, за исключением второго примера, где фамилия ставится первой. Я полагаю, что этот метод мог бы работать, если после разделения я проверяю каждый элемент и проверяю, содержит ли он '@' или '<' / '>', если нет, то можно предположить, что следующим элементом является имя. Это хороший способ подойти к этому? Я пропустил другой формат, в котором может быть адрес?


ОБНОВЛЕНИЕ: Возможно, я должен немного уточнить, в основном все, что я хочу сделать, это разбить строку, содержащую несколько адресов, на отдельные строки, содержащие адрес в любом формате, в котором он был отправлен. У меня есть свои собственные методы проверки и извлекая информацию из адреса, мне было просто сложно найти лучший способ отделить каждый адрес.

Вот решение, которое я придумал для достижения этой цели:

String str = "Last, First <name@domain.com>, name@domain.com, First Last <name@domain.com>, \"First Last\" <name@domain.com>";

List<string> addresses = new List<string>();
int atIdx = 0;
int commaIdx = 0;
int lastComma = 0;
for (int c = 0; c < str.Length; c++)
{
    if (str[c] == '@')
        atIdx = c;

    if (str[c] == ',')
        commaIdx = c;

    if (commaIdx > atIdx && atIdx > 0)
    {
        string temp = str.Substring(lastComma, commaIdx - lastComma);
        addresses.Add(temp);
        lastComma = commaIdx;
        atIdx = commaIdx;
    }

    if (c == str.Length -1)
    {
        string temp = str.Substring(lastComma, str.Legth - lastComma);
        addresses.Add(temp);
    }
}

if (commaIdx < 2)
{
    // if we get here we can assume either there was no comma, or there was only one comma as part of the last, first combo
    addresses.Add(str);
}

Приведенный выше код генерирует индивидуальные адреса, которые я могу обработать в дальнейшем.

Ответы [ 12 ]

0 голосов
/ 16 января 2009

Вот как бы я это сделал:

  • Вы можете попытаться стандартизировать данные как можно больше, т.е. избавиться от такие вещи, как символы <и> и все запятые после '.Com'. Вам понадобятся запятые которые отделяют первое и последнее имена.
  • После избавления от лишних символов поместите каждое сгруппированное письмо запись в списке в виде строки. Вы можно использовать .com, чтобы определить, где разбить строку, если это необходимо.
  • После того, как у вас есть список адресов электронной почты в списке строк, вы может затем разделить письмо адреса, использующие только пробелы в качестве разделитель.
  • Последний шаг - определить, какое имя, какое фамилия и т. д. Это будет сделано проверив 3 компонента на: запятая, которая будет указывать, что это фамилия; а. которые бы указать фактический адрес; а также все, что осталось, это имя. Если нет запятой, то первый имя первое, фамилия второе, и т.п.

    Я не знаю, является ли это наиболее сжатым решением, но оно будет работать и не требует каких-либо передовых методов программирования
0 голосов
/ 16 января 2009

Вы можете использовать регулярные выражения, чтобы попытаться отделить это, попробуйте этот парень:

^(?<name1>[a-zA-Z0-9]+?),? (?<name2>[a-zA-Z0-9]+?),? (?<address1>[a-zA-Z0-9.-_<>]+?)$

будет соответствовать: Last, First test@test.com; Last, First <test@test.com>; First last test@test.com; First Last <test@test.com>. Вы можете добавить другое необязательное совпадение в регулярное выражение в конце, чтобы выбрать последний сегмент First, Last <name@domain.com>, name@domain.com после адреса электронной почты, заключенного в угловые скобки.

Надеюсь, это поможет!

EDIT:

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

Эта ссылка может предоставить вам дополнительную информацию о сопоставлении и проверке адресов электронной почты с помощью регулярных выражений.

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