如何以“Name ”格式解析字符串

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

1 – “email@domain.com”

2 – “姓名”或“姓名”(可以存在空格)

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

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

我怎样才能做到这一点?

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

首先包括using System.Net.Mail然后你可以得到这样的信息:

 MailAddress email = new MailAddress("Johnny "); string displayName = email.DisplayName; string address = email.Address; string user = email.User; string host = email.Host; 

这将适用于您描述的两个方案,因此"Name ""Name"都可以工作并为您提供Name 。 我接着创建了一个可在此处找到的测试,它将为您提供以下示例输出:

 'email@domain.com' = DisplayName = '' Address = 'email@domain.com' User = 'email' Host = 'domain.com' 'Name' = DisplayName = 'Name' Address = 'email@domain.com' User = 'email' Host = 'domain.com' 'Name ' = DisplayName = 'Name' Address = 'email@domain.com' User = 'email' Host = 'domain.com' 

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

你可以使用正则表达式。

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

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

例:

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

您可以使用正则表达式:

  var str = "Name"; var r = new Regex("(?.*?)<(?.*?)>"); if(r.IsMatch(str)) { var m = r.Match(str); Console.WriteLine(m.Groups["name"].Trim()); Console.WriteLine(m.Groups["email"]); } 

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

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

 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 } 

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

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

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

我用以下几种输入测试了这个:

 bob@example.com  Bob Example  Bob Example "Bob Example"  "Example, Bob J."