【问题标题】:How To Parse String in format "Name <Email>"如何解析格式为“名称<电子邮件>”的字符串
【发布时间】:2012-09-15 21:12:50
【问题描述】:

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

1 - “email@domain.com”

2 -“名称”或“名称”(可以存在空格)

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

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

我该怎么做?

【问题讨论】:

    标签: c# string parsing


    【解决方案1】:

    实际上已经有一个名为 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 &lt;email@domain.com&gt;""Name&lt;email@domain.com&gt;" 都可以工作并为您提供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 很好,但您可能想在演示中使用Address 属性来表明它不仅可以提取DisplayName,还可以提取电子邮件。
    • @TimSchmelter,谢谢。我继续添加它以显示更多信息。
    • 是的,很好看。事实上,最后,我将其转换为 MailAddress 但我不知道 MailAddress 会自行完成此操作。谢谢
    【解决方案2】:

    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>
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 是的,我试图用一个正则表达式 (@"\") 做所有事情,但我错过了一些东西......
      【解决方案4】:

      你可以使用正则表达式。

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

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

      例子:

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

      【讨论】:

        【解决方案5】:

        您可以使用正则表达式:

                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"]);
                }
        

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

        【讨论】:

          【解决方案6】:

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

          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) 中我可以在联系人和电子邮件之间有或没有空格。
          • 第一种格式可以留个空格吗?如果不是,上面将确定它是 1 还是 2,您似乎在问什么。
          • 周围有空格或者没有空格?
          • 是的,可能有空格。示例:1-“johnsmith@domain.com”; 2 - "John Smith" / "John Smith " ...姓名和电子邮件之间可能有一个或多个空格。
          • 这既不是 C# 也不是 VB.NET,无论如何都不会编译。
          【解决方案7】:

          MimeKit has a method

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-05-02
            • 1970-01-01
            • 2012-09-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-18
            • 2015-09-28
            相关资源
            最近更新 更多