C#自定义字符串拆分

时间:2015-04-14 11:59:45

标签: c# string split

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"而该程序可能会遇到进一步的麻烦


有没有办法只在分隔符的前两个最后外观上拆分字符串?

提前致谢!

4 个答案:

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

    }