Heyo在那里。
我遇到了一个我最近遇到的问题。我需要一个字符串以某种格式分割:
字符串语法如下所示:
[date time]sender///receiver///message///server
通缉输出(发送方,接收方和服务器保存):
[date time]message
示例:
[2015-04-14 13:45:00]Aeon///Test///Aeon : this is my test message///S1
[2015-04-14 13:45:00]Aeon : this is my test message
到目前为止,我的代码看起来像这样(我将在下面解释问题):
private string FormatLine(string input, out string server, out string sender, out string receiver)
{
string output = input;
string[] separator = new string[] { "///" };
string[] temp;
temp = input.Split(separator, StringSplitOptions.None);
server = temp[temp.Length - 1];
sender = temp[1];
receiver = temp[2];
temp[1] = String.Empty;
temp[2] = String.Empty;
temp[temp.Length - 1] = String.Empty;
output = String.Join("", temp);
//other format/filter algorithms
return output;
}
在消息字符串中使用分隔符之前,这很有效:
[2015-04-14 13:45:00]Aeon///Test///Aeon : this is my test message :////S1
[2015-04-14 13:45:00]Aeon : this is my test message :
服务器将是" / S1"而不是" S1"
[2015-04-14 13:45:00]Aeon///Test///Aeon : this is my/// test message///S1
[2015-04-14 13:45:00]Aeon : this is my
服务器将是"测试信息"而不是" S1"而该程序可能会遇到进一步的麻烦
有没有办法只在分隔符的前两个和最后外观上拆分字符串?
提前致谢!
答案 0 :(得分:0)
你只需要粘上你不想分开的部分。这样的事情应该有效:
var message = "";
for (int i = 2; i<splitArray.Lenght -2;i++)
message+=splitArray[i]+@"\\\";
编辑:我可能有错误的索引编号,但你明白了这一点:)
答案 1 :(得分:0)
可以,但不能使用string.Split
。您需要使用RegEx来实现这一目标。定义一个正则表达式,它描述要匹配的字符串,定义它以仅捕获整行,并将&#39; /&#39; -char添加到消息组的允许字符组中。
类似下面的表达式应该有效:
^\[(?P<date>\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d\)](?P<sender>[^/]+)///(?P<tag>[^/]+)///(?P<message>.+)///(?P<server>.+$)
regexpal等网站可以帮助您创建和优化表达式。您可能需要对该表达式进行一些优化,以确保处理所有情况。这只是一个基本的例子。
不要想到在这里分裂,而是在群体中分裂。 ?P为每个组命名,因此您可以在以后的比赛的GroupCollection中更好地找到它。
答案 2 :(得分:0)
如果您不想使用正则表达式,那么只要发件人和收件人不包含///
,这就应该有效。它也应该是高效的,因为你不会多次迭代字符串的同一部分;可能比正则表达式更有效但我对此并不积极。无论如何,它肯定比正则表达式更容易理解。
string test = @"[date time]sender///receiver///message/////server";
int senderEnd = test.IndexOf("///");
int receiverEnd = test.IndexOf("///", senderEnd + 3);
int messageEnd = test.LastIndexOf("///", test.Length);
string message = test.Substring(receiverEnd + 3, messageEnd - (receiverEnd + 3));
答案 3 :(得分:0)
检查一下。必须重写代码以包括错误处理和格式检查。例如,你必须检查IndexOf方法是否返回-1但你会得到这个想法。祝你好运
private static void Main(string[] args) {
string input = "[2015-04-14 13:45:00]Aeon///Test///Aeon : this is my/// test message///S1";
const string sep = "///";
int first = input.IndexOf(sep, System.StringComparison.Ordinal);
int second = input.IndexOf(sep, first + sep.Length, System.StringComparison.Ordinal);
int last = input.LastIndexOf(sep, System.StringComparison.Ordinal);
int dl = "[2015-04-14 13:45:00]".Length;
Console.WriteLine(input.Substring(dl, first - dl));
Console.WriteLine(input.Substring(first + sep.Length, second - first - sep.Length));
Console.WriteLine(input.Substring(second + sep.Length, last - second - sep.Length));
Console.WriteLine(input.Substring(last + sep.Length, input.Length - last - sep.Length));
}