C#Regex匹配标题中的名称和电子邮件

时间:2016-02-26 15:10:15

标签: c# regex

我有这个正则表达式@"/([^<]+)\s<(.*)>/"来匹配C#中此字符串的名称和电子邮件地址:

John Doe <john.doe@gmail.com>

如果我使用Regex.Match("John Doe <john.doe@gmail.com>", @"/([^<]+)\s<(.*)>/") 结果的属性是什么,它返回集合中的名称和电子邮件地址?我查看了群组和捕获,但都没有返回正确的结果。

感谢。

3 个答案:

答案 0 :(得分:4)

您需要先删除正则表达式分隔符。见this post explaining that issue

var match = Regex.Match("John Doe <john.doe@gmail.com>", @"([^<]+)\s<(.*)>");

然后,您可以分别通过match.Groups[1].Valuematch.Groups[2].Value获取姓名和电子邮件。

但是,最好使用命名捕获组

var match = Regex.Match("John Doe <john.doe@gmail.com>", @"(?<name>[^<]+)\s<(?<mail>.*)>");

然后,您可以使用match.Groups["name"].Valuematch.Groups["mail"].Value访问这些值。

还有一个关于模式的说明:如果电子邮件不包含>也不包含<,我建议在那里使用否定字符类[^<>](匹配任何字符但是<>):

(?<name>[^<]+)\s<(?<mail>[^<>]*)>

答案 1 :(得分:2)

替代:

var m = new System.Net.Mail.MailAddress(@"John Doe <john.doe@gmail.com>");

Console.WriteLine(m.DisplayName);
Console.WriteLine(m.Address);

答案 2 :(得分:0)

您可以为捕获组命名:

(?<name>[^<]+)\s<(?<email>.*)>

然后你可以像这样使用它:

var match = Regex.Match("John Doe <john.doe@gmail.com>", @"(?<name>[^<]+)\s<(?<email>.*)>");

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