5

我有一种方法可以接收以下格式之一的联系人:

1 - “email@domain.com”

2 - “名称<email@domain.com>”或“名称<email@domain.com>”(可以存在空格)

如果是格式 (1),我什么也不做。在 (2) 的情况下,我需要解析名称和电子邮件。

我永远不知道我会以哪种格式收到电子邮件。但这将是两者之一。

我怎样才能做到这一点?

4

7 回答 7

15

实际上已经有一个名为MailAddress的 .NET 类可以非常简单地为您完成此任务。
更新:它不仅可以获取显示名称,还可以获取电子邮件地址、用户名和主机。

首先包括using System.Net.Mail,然后您可以通过以下方式获取信息:

MailAddress email = new MailAddress("Johnny <johnny@example.com>");
string displayName = email.DisplayName;
string address = email.Address;
string user = email.User;
string host = email.Host;

"Name <email@domain.com>"这将适用于您所描述的两种情况,并且"Name<email@domain.com>"都可以为您提供Name. 我继续创建了一个可以在此处找到的测试,它将为您提供以下示例输出:

'email@domain.com' =
   DisplayName = ''
   Address = 'email@domain.com'
   User = 'email'
   Host = 'domain.com'
'Name<email@domain.com>' =
   DisplayName = 'Name'
   Address = 'email@domain.com'
   User = 'email'
   Host = 'domain.com'
'Name <email@domain.com>' =
   DisplayName = 'Name'
   Address = 'email@domain.com'
   User = 'email'
   Host = 'domain.com'
于 2012-09-15T22:33:50.290 回答
1

MailAddress是一个很好的解决方案,但遗憾的System.Net.Mail是尚未移植到 .NET Core。

我发现以下正则表达式解决方案适用于格式合理的输入:

var re = new Regex(@"""?((?<name>.*?)""?\s*<)?(?<email>[^>]*)");
var match = re.match(input);

var name = match.Groups["name"].Value;
var email = match.Groups["email"].Value;

我已经使用以下类型的输入对此进行了测试:

bob@example.com
<bob@example.com>
Bob Example <bob@example.com>
Bob Example<bob@example.com>
"Bob Example" <bob@example.com>
"Example, Bob J." <bob@example.com>
于 2017-03-14T00:18:18.063 回答
0

有几种方法可以做到这一点,但发生的第一个是

String[] parts = someValue.Trim().Split(new char[] {' '},false);

if (parts.Length > 1) then
{
// in format "Name OR Name" or more correctly not in format someone@domain.com
}
于 2012-09-15T21:18:16.743 回答
0

您可以设计一个简单的正则表达式(在我看来,在这种情况下,这将是一个优雅的解决方案)或调用Split()with'<'作为分隔符,Trim()第一个字符串并'>'从第二个字符串中删除关闭。

于 2012-09-15T21:59:09.830 回答
0

您可以使用正则表达式:

        var str = "Name<email@domain.com>";

        var r = new Regex("(?<name>.*?)<(?<email>.*?)>");

        if(r.IsMatch(str))
        {
            var m = r.Match(str);
            Console.WriteLine(m.Groups["name"].Trim());
            Console.WriteLine(m.Groups["email"]);
        }

在这里,我假设您不需要验证电子邮件格式并且名称没有 < 或 > 字符

于 2012-09-15T22:02:59.630 回答
0

你可以使用正则表达式。

^((.*?)\s*?<)(.*?)>?$

名称(如果可用)将在第二个捕获组中,而电子邮件将在第三个中。

例子:

var match = Regex.Match("Name <email@domain.com>", @"^((.*?)\s*?<)(.*?)>?$");
string name = math.Groups[2].Value;
string email = match.Groups[3].Value;
于 2012-09-15T22:12:27.960 回答
0

MimeKit有一个方法

MailboxAddress addr = MailboxAddress.Parse("Mr. Curious <mrcurious@example.com>"); 

它也适用于 .NET、Mono 和 .NET Core。

于 2020-04-30T14:11:56.987 回答