如何使用正则表达式对多个电子邮件地址和用户名进行分组

时间:2009-08-04 14:39:57

标签: c# asp.net vb.net regex

我正在尝试解析以下文本:

"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”之后将整个字符串抓到最后一个引号。我很难把一个表达式放在一起,将这个字符串组合成我正在寻找的两个组:名称(在引号中)和电子邮件(在尖括号中)。有没有人对改变正则表达式有任何建议或建议以获得我需要的东西?

4 个答案:

答案 0 :(得分:2)

我会这样做,而不是滚动你自己的正则表达式:

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 :(得分:1)

正则表达式"""([^""]*)"" <([^>]*)>"怎么样?即明确指出匹配的部分不包括引用/结束语。您可能还想使用限制性更强的字符范围。

答案 2 :(得分:0)

您需要指定您想要最小匹配的表达式。 您还可以用更精确的模式替换(。*)模式: 例如,您可以排除逗号和空格... 通常最好避免在正则表达式中使用。*,因为它会降低性能!

例如,对于电子邮件,您可以使用[\ w - ] + @([\ w - ] +。)+ [\ w - ] +等模式或更复杂的模式。
您可以在http://regexlib.com/

上找到一些好的模式

答案 3 :(得分:0)

不确定正在运行的是什么正则表达式引擎ASP.net但是通过添加?来尝试非贪婪的变体?在正则表达式。

示例正则表达式

""(.*?)"" <(.*?)>