如何以“Name <email>”</email>格式解析字符串

时间:2012-09-15 21:12:51

标签: c# string parsing

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

1 - “email@domain.com”

2 - “姓名&lt; email@domain.com>”或“名称&lt; email@domain.com>” (可以存在空间)

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

我永远不知道我会收到哪种格式的电子邮件。但它将是两者中的一个。

我该怎么做?

7 个答案:

答案 0 :(得分:13)

实际上已经有一个名为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。我继续创建了一个可以找到here的测试,它将为您提供以下示例输出:

'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'

答案 1 :(得分: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
}

答案 2 :(得分:0)

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

答案 3 :(得分: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"]);
        }

这里我假设你不需要验证电子邮件格式,而且名称不具有&lt;或者&gt;字符

答案 4 :(得分:0)

你可以使用正则表达式。

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

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

示例:

var match = Regex.Match("Name <email@domain.com>", @"^((.*?)\s*?<)(.*?)>?$");
string name = math.Groups[2].Value;
string email = match.Groups[3].Value;

答案 5 :(得分:0)

button1 = frame.add_button('divisable by 6?', button_handler) 是一个很好的解决方案,但不幸的是MailAddress尚未移植到.NET Core。

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

System.Net.Mail

我用以下几种输入对此进行了测试:

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

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

答案 6 :(得分:0)

MimeKit has a method

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

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