簡體   English   中英

C#自定義字符串拆分

[英]C# Custom 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”,並且程序可能會遇到進一步的麻煩


有什么方法只能在分隔符的前兩個最后一個出現時拆分字符串嗎?

提前致謝!

您只需要粘回不想拆分的零件。 這樣的事情應該起作用:

var message = "";
for (int i = 2; i<splitArray.Lenght -2;i++)
    message+=splitArray[i]+@"\\\";

編輯:我可能有錯誤的索引號,但你有主意:)

可以,但不能使用string.Split 您需要使用RegEx來實現。 定義一個正則表達式,該表達式描述要匹配的字符串,定義它以僅捕獲整行並將'/'-char添加到message-group的允許字符組中。 類似於以下表達式的東西應該起作用:

^\[(?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中更好地找到它。

如果您不想使用正則表達式,那么只要發送者和接收者不包含/// 這也應該是有效的,因為您永遠不會多次重復訪問字符串的同一部分。 可能比正則表達式更有效,但我對此並不樂觀。 無論如何,它當然比正則表達式更容易理解。

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

看一下這個。 必須重寫代碼以包括錯誤處理和格式檢查。 例如,您必須檢查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));

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM