Итак, я работаю с некоторыми данными заголовка электронной почты, а для полей 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);
}
Приведенный выше код генерирует индивидуальные адреса, которые я могу обработать в дальнейшем.