Итак, я работаю с некоторыми данными заголовка электронной почты, а для полей from:, cc:, и bcc: адрес электронной почты может быть выражен несколькими способами:
First Last <[email protected]>
Last, First <[email protected]>
[email protected]
И эти вариации могут отображаться в одном и том же сообщении в любом порядке в одной строке, разделенной запятой:
First, Last <[email protected]>, [email protected], First Last <[email protected]>
Я пытаюсь разобраться с этой строкой в отдельном имени, фамилии, электронной почте для каждого человека (без имени, если предоставляется только адрес электронной почты).
Может кто-нибудь предложить лучший способ сделать это?
Я попытался разделить запятые, которые будут работать, кроме как во втором примере, где первое место помещается первым. Я полагаю, что этот метод мог бы работать, если после я split я исследую каждый элемент и вижу, содержит ли он '@' или '<'/' > ', если это не так, тогда можно предположить, что следующий элемент первое имя. Это хороший способ приблизиться к этому? Упустил ли я другой формат, который может быть в адресе?
UPDATE: Возможно, я должен немного разъяснить, в основном все, что я хочу сделать, это разбить строку, содержащую несколько адресов, на отдельные строки, содержащие адрес в любом формате, в котором он был отправлен. У меня есть свои собственные методы проверки и извлекая информацию из адреса, мне было просто сложно найти лучший способ разделить каждый адрес.
Вот решение, которое я придумал, чтобы выполнить это:
String str = "Last, First <[email protected]>, [email protected], First Last <[email protected]>, \"First Last\" <[email protected]>";
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);
}
Приведенный выше код генерирует отдельные адреса, которые я могу обрабатывать дальше по строке.