我的字符串如下:
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开头。
答案 0 :(得分:9)
你总是会有三个部分,你只想分开前两个分号吗?
如果是这样,只需使用Split的重载,它允许您指定要返回的子串数:
string[] bits = text.Split(new char[]{';'}, 3);
答案 1 :(得分:4)
我建议建立一个正则表达式
(smtp|SMTP|X400|X500):((?!smtp:|SMTP:|X400:|X500:).)*;?
或无协议
.*?:((?![^:;]*:).)*;?
换句话说,找到任何以您的协议开头的内容。匹配冒号。然后,只要您不匹配其中一个协议,就继续匹配字符。用分号结束(可选)。
然后,您可以解析在':'上拆分的匹配列表,您将拥有自己的协议。此外,如果您想添加协议,只需将它们添加到列表中即可。
但是,您可能希望将整个事件指定为不区分大小写,并且仅以大写或小写版本列出协议。
无协议版本并不关心协议的名称。通过匹配所有内容,但排除字符串后跟冒号或分号,它只是发现它们完全相同。
答案 2 :(得分:3)
按以下正则表达式模式分割
string[] items = System.Text.RegularExpressions.Split(text, ";(?=\w+:)");
编辑:更好的人可以在协议名称中接受更多特殊字符。
string[] items = System.Text.RegularExpressions.Split(text, ";(?=[^;:]+:)");
答案 3 :(得分:1)
http://msdn.microsoft.com/en-us/library/c1bs0eda.aspx 检查那里,你可以指定你想要的分割数量。所以在你的情况下你会做
string.split(new char[]{';'}, 3);
答案 4 :(得分:1)
这引起了我的好奇心 ....所以这段代码实际上完成了这项工作,但又想要整理:)
我的最后一次尝试 - 停止改变你需要的东西; =)
static void Main(string[] args)
{
string 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(new char[] { ';' });
List<string> addresses = new List<string>();
StringBuilder address = new StringBuilder();
foreach (string part in parts)
{
if (part.Contains(":"))
{
if (address.Length > 0)
{
addresses.Add(semiColonCorrection(address.ToString()));
}
address = new StringBuilder();
address.Append(part);
}
else
{
address.AppendFormat(";{0}", part);
}
}
addresses.Add(semiColonCorrection(address.ToString()));
foreach (string emailAddress in addresses)
{
Console.WriteLine(emailAddress);
}
Console.ReadKey();
}
private static string semiColonCorrection(string address)
{
if ((address.StartsWith("x", StringComparison.InvariantCultureIgnoreCase)) && (!address.EndsWith(";")))
{
return string.Format("{0};", address);
}
else
{
return address;
}
}
答案 5 :(得分:1)
如果你这么做的话,不是最快的,但它会适用于我认为的所有情况。
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();
当然,很多人会声称正则表达式:现在你有两个问题。甚至可能有比这更好的正则表达式答案。
答案 6 :(得分:1)
你总是可以在冒号上拆分并有一点逻辑来获取键和值。
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));
}
使用两个样本进行测试,效果很好。
答案 7 :(得分:0)
试试这些正则表达式。您可以使用命名组提取您要查找的内容。
X400:(?<X400>.*?)(?:smtp|SMTP|$)
smtp:(?<smtp>.*?)(?:;+|$)
SMTP:(?<SMTP>.*?)(?:;+|$)
确保在构造它们时指定不区分大小写。它们似乎与您提供的样品一起使用
答案 8 :(得分:0)
很多尝试。这是我的;)
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"]);
}
以任何外观顺序查找字符串中的所有smtp,x400或x500地址。它还标识准备进一步处理的地址类型。地址本身中文本smtp,x400或x500的出现不会扰乱模式。
答案 9 :(得分:0)
这有效!
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);
}
答案 10 :(得分:-1)
分号(;)拆分然后循环结果,重新组合没有冒号(:)的元素与前一个元素。
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);
答案 11 :(得分:-1)
这是另一种可能的解决方案。
string[] bits = text.Replace(";smtp", "|smtp").Replace(";SMTP", "|SMTP").Replace(";X400", "|X400").Split(new char[] { '|' });
位[0], 位[1],和 比特[2] 然后将包含原始字符串中的三个部分。