Как я могу сгруппировать несколько адресов электронной почты и имен пользователей с помощью регулярного выражения - PullRequest
1 голос
/ 04 августа 2009

У меня есть следующий текст, который я пытаюсь проанализировать:

"user1@emailaddy1.com" <user1@emailaddy1.com>, "Jane Doe" <jane.doe@ addyB.org>,
"joe@company.net" <joe@company.net>

Я использую следующий код, чтобы попытаться разделить строку:

Dim groups As GroupCollection
Dim matches As MatchCollection
Dim regexp1 As New Regex("""(.*)"" <(.*)>")
matches = regexp1 .Matches(toNode.InnerText)
For Each match As Match In matches
    groups = match.Groups
    message.CompanyName = groups(1).Value
    message.CompanyEmail = groups(2).Value
Next

Но это регулярное выражение жадное и захватывает всю строку до последней кавычки после "joe@company.net". Я с трудом собираю выражение, которое сгруппирует эту строку в две группы, которые я ищу: Имя (в кавычках) и E-Mail (в угловых скобках). У кого-нибудь есть какие-либо советы или предложения по изменению регулярного выражения, чтобы получить то, что мне нужно?

Ответы [ 4 ]

2 голосов
/ 04 августа 2009

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

string[] addresses = toNode.InnerText.Split(",");
foreach(string textAddress in addresses)
{
    textAddress = address.Trim();
    MailAddress address = new MailAddress(textAddress);
    message.CompanyName = address.DisplayName;
    message.CompanyEmail = address.Address;
}

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

1 голос
/ 04 августа 2009

Как насчет """([^""]*)"" <([^>]*)>" для регулярного выражения? То есть сделайте явным, что совпавшая часть не будет включать в себя кавычку / закрывающее слово. Вы также можете использовать более ограниченный диапазон символов.

0 голосов
/ 04 августа 2009

Не знаете, какой движок регулярных выражений ASP.net работает, но попробуйте не жадный вариант, добавив? в регулярном выражении.

Пример регулярного выражения

""(.*?)"" <(.*?)>
0 голосов
/ 04 августа 2009

Вам нужно указать, что вы хотите минимальное совпадение выражения. Вы также можете заменить шаблон (. *) На более точный: Например, вы можете исключить запятую и пробел ... Обычно лучше избегать использования. * В регулярном выражении, потому что это снижает производительность!

Например, для электронной почты вы можете использовать шаблон типа [\ w -] + @ ([\ w -] +.) + [\ W -] + или более сложный.
Вы можете найти несколько хороших моделей на: http://regexlib.com/

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