Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.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
C# 如何将此字符串拆分为数组?_C#_String - Fatal编程技术网

C# 如何将此字符串拆分为数组?

C# 如何将此字符串拆分为数组?,c#,string,C#,String,我的字符串如下: smtp:jblack@test.com;SMTP:jb@test.com;X400:C=US;A= ;P=Test;O=Exchange;S=Jack;G=Black; 我需要回来: smtp:jblack@test.com SMTP:jb@test.com X400:C=US;A= ;P=Test;O=Exchange;S=Jack;G=Black; 问题在于分号将地址和X400地址的一部分分开。有人能建议如何最好地分割这个吗 PS我应该提到,顺序不同,因此可能是: X

我的字符串如下:

smtp:jblack@test.com;SMTP:jb@test.com;X400:C=US;A= ;P=Test;O=Exchange;S=Jack;G=Black;
我需要回来:

smtp:jblack@test.com
SMTP:jb@test.com
X400:C=US;A= ;P=Test;O=Exchange;S=Jack;G=Black;
问题在于分号将地址和X400地址的一部分分开。有人能建议如何最好地分割这个吗

PS我应该提到,顺序不同,因此可能是:

X400:C=US;A= ;P=Test;O=Exchange;S=Jack;G=Black;;smtp:jblack@test.com;SMTP:jb@test.com

可以有3个以上的地址,4,5。。10等,包括一个X500地址,但是它们都以smtp:smtp:X400或X500开头。

编辑:有了更新的信息,这个答案当然不会起作用-但它仍然可能有用,所以我将它留在这里

你会一直有三个部分,你只想在前两个分号上分开吗

如果是这样,只需使用Split重载,它允许您指定要返回的子字符串数:

string[] bits = text.Split(new char[]{';'}, 3);
选中此处,可以指定所需的拆分数量。所以在你的情况下,你会这样做

string.split(new char[]{';'}, 3);
将分号(;)拆分,然后在结果上循环,将没有冒号(:)的每个元素与前一个元素重新组合

string input = "X400:C=US;A= ;P=Test;O=Exchange;S=Jack;G="
  +"Black;;smtp:jblack@test.com;SMTP:jb@test.com";

string[] rawSplit = input.Split(';');

List<string> result = new List<string>();
  //now the fun begins
string buffer = string.Empty;
foreach (string s in rawSplit)
{
  if (buffer == string.Empty)
  {
    buffer = s;
  }
  else if (s.Contains(':'))
  {   
    result.Add(buffer);
    buffer = s;
  }
  else
  {
    buffer += ";" + s;
  }
}
result.Add(buffer);

foreach (string s in result)
  Console.WriteLine(s);
string input=“X400:C=US;A=;P=Test;O=Exchange;S=Jack;G=”
+“黑色;;smtp:jblack@test.com;SMTP:jb@test.com";
字符串[]rawSplit=input.Split(“;”);
列表结果=新列表();
//现在乐趣开始了
字符串缓冲区=string.Empty;
foreach(rawspilt中的字符串s)
{
if(buffer==string.Empty)
{
缓冲区=s;
}
else如果(s.Contains(':'))
{   
结果:添加(缓冲区);
缓冲区=s;
}
其他的
{
缓冲区+=“;”+s;
}
}
结果:添加(缓冲区);
foreach(结果中的字符串s)
控制台。写入线(s);

这引起了我的好奇心。。。。因此,这段代码实际上完成了这项工作,但同样需要整理:)

我的最后一次尝试-停止更改所需内容;=)

static void Main(字符串[]args)
{
字符串fneh=“X400:C=US400;A=;P=Test;O=Exchange;S=Jack;G=Black;X400:C=US400l;A=l;P=Testl;O=Exchangel;S=Jackl;G=Blackl;smtp:jblack@test.com;X500:C=US500;A=;P=Test;O=Exchange;S=Jack;G=Black;SMTP:jb@test.com;";
string[]parts=fneh.Split(新字符[]{';'});
列表地址=新列表();
StringBuilder地址=新的StringBuilder();
foreach(部分中的字符串部分)
{
如果(部分包含(“:”)
{
如果(address.Length>0)
{
address.Add(分号更正(address.ToString());
}
地址=新的StringBuilder();
地址。附加(部分);
}
其他的
{
address.AppendFormat(“;{0}”,部分);
}
}
address.Add(分号更正(address.ToString());
foreach(地址中的字符串emailAddress)
{
Console.WriteLine(电子邮件地址);
}
Console.ReadKey();
}
专用静态字符串分号更正(字符串地址)
{
if((address.StartsWith(“x”,StringComparison.InvariantCultureIgnoreCase))&&(!address.EndsWith(“;”))
{
返回字符串。格式(“{0};”,地址);
}
其他的
{
回信地址;
}
}

试试这些正则表达式。您可以使用命名组提取您要查找的内容

X400:(?<X400>.*?)(?:smtp|SMTP|$)
smtp:(?<smtp>.*?)(?:;+|$)
SMTP:(?<SMTP>.*?)(?:;+|$)
X400:(?*)(:smtp | smtp |$)
smtp:(?*?(;+)$)
SMTP:(?*?(;+)$)

确保在构造它们时指定不区分大小写。如果你经常这样做的话,它们似乎对你提供的样本有效,但不是最快的,但我相信它对所有情况都有效

        string input1 = "smtp:jblack@test.com;SMTP:jb@test.com;X400:C=US;A= ;P=Test;O=Exchange;S=Jack;G=Black;";
        string input2 = "X400:C=US;A= ;P=Test;O=Exchange;S=Jack;G=Black;;smtp:jblack@test.com;SMTP:jb@test.com";
        Regex splitEmailRegex = new Regex(@"(?<key>\w+?):(?<value>.*?)(\w+:|$)");

        List<string> sets = new List<string>();

        while (input2.Length > 0)
        {
            Match m1 = splitEmailRegex.Matches(input2)[0];
            string s1 = m1.Groups["key"].Value + ":" + m1.Groups["value"].Value;
            sets.Add(s1);
            input2 = input2.Substring(s1.Length);
        }

        foreach (var set in sets)
        {
            Console.WriteLine(set);
        }

        Console.ReadLine();
string input1=“smtp:jblack@test.com;SMTP:jb@test.com;X400:C=US;A=;P=Test;O=Exchange;S=Jack;G=Black;“;
string input2=“X400:C=US;A=;P=Test;O=Exchange;S=Jack;G=Black;;smtp:jblack@test.com;SMTP:jb@test.com";
Regex splitEmailRegex=newregex(@“(?\w+):(?*?)(\w+:|$)”;
列表集=新列表();
while(input2.Length>0)
{
Match m1=splitEmailRegex.Matches(input2)[0];
字符串s1=m1.Groups[“key”].Value+“:“+m1.Groups[“Value”].Value;
添加(s1);
input2=input2.子字符串(s1.长度);
}
foreach(集合中的变量集)
{
控制台写入线(套);
}
Console.ReadLine();

当然,很多人会声称Regex:现在你有两个问题。甚至可能还有比这个更好的正则表达式答案。

您可以在冒号上拆分,并有一点逻辑来获取键和值

string[] bits = text.Split(':');
List<string> values = new List<string>();
for (int i = 1; i < bits.Length; i++)
{
    string value = bits[i].Contains(';') ? bits[i].Substring(0, bits[i].LastIndexOf(';') + 1) : bits[i];
    string key = bits[i - 1].Contains(';') ? bits[i - 1].Substring(bits[i - 1].LastIndexOf(';') + 1) : bits[i - 1];
    values.Add(String.Concat(key, ":", value));
}
string[]bits=text.Split(“:”);
列表值=新列表();
for(int i=1;i

用两个示例测试了它,效果很好。

我可以建议构建一个正则表达式吗

(smtp|SMTP|X400|X500):((?!smtp:|SMTP:|X400:|X500:).)*;?
或无协议

.*?:((?![^:;]*:).)*;?
换句话说,找到任何以你的协议开始的东西。匹配冒号。然后继续匹配字符,只要不匹配某个协议。以分号结束(可选)

然后,您可以解析“:”上的匹配项列表,并获得您的协议。此外,如果要添加协议,只需将它们添加到列表中即可

但是,您可能希望将整个内容指定为不区分大小写,并且只列出大写或小写版本的协议


无协议版本不关心协议的名称。它只是通过将所有内容匹配到,但不包括后跟冒号或分号的字符串来查找所有相同的内容。

按以下正则表达式模式拆分

string[] items = System.Text.RegularExpressions.Split(text, ";(?=\w+:)");
编辑:更好的方法是在协议名称中接受更多的特殊字符

string[] items = System.Text.RegularExpressions.Split(text, ";(?=[^;:]+:)");

这是另一个可能的解决办法


字符串[]位=text.Replace(“;smtp”,“| smtp”).Replace(“;smtp”,“| smtp”).Replace(“;X400”,“| X400”).Split(新字符[]{'});

位[0], 位[1],以及 位[2] 将按原始字符串的顺序包含三个部分。

很多
string[] items = System.Text.RegularExpressions.Split(text, ";(?=[^;:]+:)");
string src = "smtp:jblack@test.com;SMTP:jb@test.com;X400:C=US;A= ;P=Test;O=Exchange;S=Jack;G=Black;";

Regex r = new Regex(@"
   (?:^|;)smtp:(?<smtp>([^;]*(?=;|$)))|
   (?:^|;)x400:(?<X400>.*?)(?=;x400|;x500|;smtp|$)|
   (?:^|;)x500:(?<X500>.*?)(?=;x400|;x500|;smtp|$)",
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

foreach (Match m in r.Matches(src))
{
    if (m.Groups["smtp"].Captures.Count != 0)
        Console.WriteLine("smtp: {0}", m.Groups["smtp"]);
    else if (m.Groups["X400"].Captures.Count != 0)
        Console.WriteLine("X400: {0}", m.Groups["X400"]);
    else if (m.Groups["X500"].Captures.Count != 0)
        Console.WriteLine("X500: {0}", m.Groups["X500"]);   
}
    string input =
        "smtp:jblack@test.com;SMTP:jb@test.com;X400:C=US;A= ;P=Test;O=Exchange;S=Jack;G=Black;";
    string[] parts = input.Split(';');
    List<string> output = new List<string>();
    foreach(string part in parts)
    {
        if (part.Contains(":"))
        {
            output.Add(part + ";");
        }
        else if (part.Length > 0)
        {
            output[output.Count - 1] += part + ";";
        }
    }
    foreach(string s in output)
    {
        Console.WriteLine(s);
    }