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

C# 如何使用正则表达式对多个电子邮件地址和用户名进行分组,c#,asp.net,vb.net,regex,C#,Asp.net,Vb.net,Regex,我正试图解析以下文本: "user1@emailaddy1.com" <user1@emailaddy1.com>, "Jane Doe" <jane.doe@ addyB.org>, "joe@company.net" <joe@company.net> "user1@emailaddy1.com“,”无名氏“, "joe@company.net" 我正在使用以下代码尝试拆分字符串: Dim groups As GroupCollection Dim ma

我正试图解析以下文本:

"user1@emailaddy1.com" <user1@emailaddy1.com>, "Jane Doe" <jane.doe@ addyB.org>, "joe@company.net" <joe@company.net> "user1@emailaddy1.com“,”无名氏“, "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
Dim组作为GroupCollection
将匹配项设置为MatchCollection
Dim regexp1作为新的正则表达式(“”(.*)“”)
matches=regexp1.matches(toNode.InnerText)
将每个比赛作为比赛中的比赛
组=匹配。组
message.CompanyName=组(1).Value
message.CompanyEmail=组(2).Value
下一个

但是这个正则表达式是贪婪的,它会获取整个字符串,直到“0”之后的最后一个引号joe@company.net". 我很难将一个表达式组合在一起,将这个字符串分为两组:Name(在引号中)和E-Mail(在尖括号中)。有人对修改regexp以获得我需要的东西有什么建议吗?

关于regex的
“([^”“]*)”“]*)”]*)>“
如何?也就是说,明确匹配的部分不包括报价/结束价。您可能还需要使用更严格的字符范围。

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

例如,对于电子邮件,您可以使用[\w-]+@([\w-]+)+[\w-]+或更复杂的模式。

您可以在以下网站上找到一些好的模式:

不确定哪个regexp引擎ASP.net正在运行,但通过添加一个?在正则表达式中

示例正则表达式

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

与其滚动自己的正则表达式,不如这样做:

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;
}

而正则表达式可能适用于所显示的少数测试用例。从长远来看,使用
maildaddress
类可能会更加可靠。

甚至没有想过要这么做!!只要DisplayName不是“Doe,Jane”,这个方法就可以很好地工作。。。你对如何针对那些特殊的PITA情况修改此方法有什么建议吗?不幸的是,我没有一个简单的答案。。。但是这个答案()似乎建议使用TextFieldParser类来处理逗号分隔的内容。我最终有点作弊,但希望它能保持事情的可靠性。我在拆分之前添加了这一行:Dim seps()作为String={,“”“},并将拆分行更改为:Dim addresses()作为String=toNode.InnerText.split(seps,StringSplitOptions.removemptyentries)。第一部分应该是
([^”“]*),
,而不是
([^]*)”,
。当然可以。我被那些标点符号弄糊涂了;-)