[英]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.