Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
string.Split C#将文本保留在分隔符之外_C#_Delimiter - Fatal编程技术网

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

string.Split C#将文本保留在分隔符之外,c#,delimiter,C#,Delimiter,我正在尝试将电子邮件地址以及名字和姓氏列表转换为CSV格式。我的电子邮件地址格式如下: First, Last <email1@example.com>; First, Last <email2@example.com>; 我正在使用以下代码: string[] addresses = addresses_Delimited.Split(new Char[] { '<', '>' }); string[]addresses=addresses_Delimi

我正在尝试将电子邮件地址以及名字和姓氏列表转换为CSV格式。我的电子邮件地址格式如下:

First, Last <email1@example.com>; First, Last <email2@example.com>;
我正在使用以下代码:

string[] addresses = addresses_Delimited.Split(new Char[] { '<', '>' });
string[]addresses=addresses_Delimited.Split(新字符[]{''});
地址\u Delimited
是我的原始格式地址列表

问题是它没有消除名字和姓氏;相反,它将名字和姓氏作为数组
地址中的条目返回。所以,
地址[0]
=“第一,最后”,
地址[1]
=”email1@example.com,和地址[2]
=“第一个,最后一个”。第一个条目之后的所有名字和姓氏条目中都有分号


如何使
string.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]);
}
var s=“First,Last;First,Last;”;
正则表达式正则表达式=新正则表达式(@“]+)>”;
foreach(正则表达式中的匹配m.Matches){
Console.WriteLine(m.Groups[1]);
}

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

// 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]);
}
//使用System.Text.RegularExpressions;
//模式=介于<和>之间的任意字符数。
变量模式=@“\”;
var matches=Regex.matches(地址分隔,模式);
foreach(匹配中的匹配m){
Console.WriteLine(m.Groups[1]);
}
先按“;”拆分,然后按“”拆分

string inputEmails=“First1,Last1;第一个2,最后一个2;";
string[]inputEmailsArray=inputEmails.Split(新字符[]{';'},StringSplitOptions.RemoveEmptyEntries);
foreach(inputEmailsArray中的字符串电子邮件)
{
string[]inputEmailArray=email.Split(新字符[]{''},StringSplitOptions.RemoveEmptyEntries);
foreach(inputEmailArray中的字符串emailPart)
{
字符串s=emailPart;//First1,Last1//email1@example.com
}
}

你可以用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('>'));
}
var text=“第一,最后;第一,最后;";
var t=text.TrimEnd(“;”).Split(“;”);
foreach(t中的m变量)
{
控制台写入线(m.Split(“”));
}
请改用RegularExpression。

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

使用System.Linq;
使用System.Net.Mail;
...
var input=“第一,最后;第一,最后;";
var=String.Join(“,”,输入
.Split(新字符[]{“;”},StringSplitOptions.RemoveEmptyEntries)
。选择(s=>新邮件地址。地址));

试试正则表达式。@L-Three你是说我不能用
字符串来做这件事。拆分
?检查这个链接。@ServerS:这确实是我要说的。这假设你的输入文件格式正确。否则使用正则表达式(见其他答案)
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
    }
}
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('>'));
}
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));