string.Split C#将文本保留在分隔符之外

时间:2015-05-05 14:24:44

标签: c# delimiter

我正在尝试列出电子邮件地址以及名字和姓氏,并将它们转换为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删除“&lt;”之外的所有文字和“&gt;”?我需要使用其他东西吗?

5 个答案:

答案 0 :(得分:6)

不使用不关心分隔符配对的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.

答案 1 :(得分: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]);
}

答案 2 :(得分:0)

拆分&#34;;&#39;首先,然后按&#34;&lt;&#34;和&#34;&gt;&#34;。

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
    }
}

答案 3 :(得分:0)

你可以用拆分来做 - 但它真的很难看:

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('>'));
}

改为使用RegularExpression。

答案 4 :(得分:0)

假设(这是一个很大的假设),任何名称或电子邮件中都没有;个字符,并且任何电子邮件中都没有,个字符,{ {3}}:

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));