如何以“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."