【问题标题】:string.Split C# keeps text outside delimitersstring.Split C# 将文本保留在分隔符之外
【发布时间】:2015-05-05 23:30:34
【问题描述】:

我正在尝试获取电子邮件地址列表以及名字和姓氏,并将它们转换为 CSV 格式。我的电子邮件地址采用以下格式:

First, Last <email1@example.com>; First, Last <email2@example.com>;

我需要的输出如下:

email1@example.com,email2@example.com

我正在使用以下代码:

string[] addresses = addresses_Delimited.Split(new Char[] { '<', '>' });

addresses_Delimited 是我的原始地址列表。

问题在于它没有消除名字和姓氏;相反,它返回名字和姓氏作为数组addresses 中的条目。所以,addresses[0] = "First, Last", addresses[1] = "email1@example.com", 和 addresses[2] = "; First, Last"。第一个之后的所有名字和姓氏条目都包含一个分号。

如何使string.Split 删除“”之外的所有文本?我需要使用其他东西吗?

【问题讨论】:

标签: c# delimiter


【解决方案1】:

与其使用不关心分隔符是否配对的Split,不如使用如下正则表达式:

<([^>]+)>

当您将此正则表达式应用于输入字符串时,您会将尖括号的内容捕获到捕获组编号 1:

var s = "First, Last <email1@example.com>; First, Last <email2@example.com>;";
Regex regex = new Regex(@"<([^>]+)>");
foreach (Match m in regex.Matches(s)) {
    Console.WriteLine(m.Groups[1]);
}

Demo.

【讨论】:

    【解决方案2】:

    Split 在这种情况下不起作用。您需要使用正则表达式。试试这个

    // using System.Text.RegularExpressions;
    // pattern = any number of arbitrary characters between < and >.
    var pattern = @"\<(.*?)\>";
    var matches = Regex.Matches(addresses_Delimited, pattern);
    
    foreach (Match m in matches) {
        Console.WriteLine(m.Groups[1]);
    }
    

    【讨论】:

      【解决方案3】:

      你可以用 split 来做到这一点 - 但它真的很难看:

      var text = "First, Last <email1@example.com>; First, Last <email2@example.com>;";
      
      var t = text.TrimEnd(';').Split(';');
      foreach (var m in t)
      {
          Console.WriteLine(m.Split('<')[1].TrimEnd('>'));
      }
      

      改用正则表达式。

      【讨论】:

        【解决方案4】:

        假设(这是一个很大的假设)任何姓名或电子邮件中都没有; 字符,并且任何电子邮件中都没有, 字符,this will work

        using System.Linq;
        using System.Net.Mail;
        
        ...
        
        var input = "First, Last <email1@example.com>; First, Last <email2@example.com>;";
        
        var emails = String.Join(",", input
          .Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
          .Select(s => new MailAddress(s).Address));
        

        【讨论】:

          【解决方案5】:

          用“;”分割首先,然后是“”。

          string inputEmails = "First1, Last1 <email1@example.com>; First2, Last2 <email2@example.com>;";
          string[] inputEmailsArray = inputEmails.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
          foreach (string email in inputEmailsArray)
          {
              string[] inputEmailArray = email.Split(new char[] { '<', '>' }, StringSplitOptions.RemoveEmptyEntries);
              foreach (string emailPart in inputEmailArray)
              {
                  string s = emailPart;   // First1, Last1     // email1@example.com
              }
          }
          

          【讨论】:

          • 这假设您的输入文件格式正确。否则使用正则表达式(见其他答案)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-25
          • 1970-01-01
          • 2015-02-26
          • 1970-01-01
          • 2012-08-27
          • 2011-06-08
          相关资源
          最近更新 更多