2016-01-01 55 views
0

一些的話,我有RTB有這樣的文字:刪除RichTextBox的

2016-01-01T10:47:19Z Info {"message":"stopped establish worker"} 
2016-01-01T10:47:19Z Info {"message":"stop establishing"} 
2016-01-01T10:47:25Z Alert {"message":"DoStatusRequest failed for 188.166.29.241"] 

我的問題是,什麼樣的代碼,可以讓我的RTB只顯示文本這樣

stopped establish worker 
stop establishing 
DoStatusRequest failed for 188.166.29.241 

我已經使用這個代碼但沒有發生。

List<string> finalLines = richTextBox1.Lines.ToList(); 
finalLines.RemoveAll(x => x.StartsWith("2016") && x.EndsWith("message\":\"")); 
richTextBox1.Lines = finalLines.ToArray(); 
+3

歡迎來到Stack Overflow。你有沒有試過_anything_來解決你的問題?首先顯示你的努力,以便人們可以展示他們的。請閱讀[常見問題]和[問]作爲開始...... –

+1

您已經表明自己絕對沒有努力嘗試解決這個問題。我建議你自己去嘗試一下,如果你遇到了一些你經過一番研究並付出足夠努力後肯定無法解決的編程問題,那麼你應該在這裏提出一個問題。 –

+0

來吧,他需要一些幫助不被拒絕。 –

回答

2

在你的代碼的兩個錯誤是您

  • 假設List.RemoveAll(Predicate<T>)將刪除部分字符串的。但它會刪除符合條件的每行完全

  • 您忘記在字符串匹配中包含結尾字符,因此沒有行匹配。

爲了解決這樣的任務你有兩種常見的方式可供選擇:

  • 使用RegEx
  • 使用字符串操作

在這種情況下,去爲字符串操作很簡單:

List<string > lines = richTextBox1.Lines.ToList(); 
lines = lines.Select(x => x.Substring(0, x.Length - 2) 
          .Substring(x.IndexOf("\":\"") + 3)).ToList(); 
richTextBox1.Lines = lines.ToArray(); 

但是,這是否靈活和足夠安全將始終取決於數據的特性。

Regex的情況也是如此,但這些對於處理更多動態數據或處理可以利用其字符組或高級模式匹配的問題非常有用,特別是在您不知道if以及將會有多少比賽。

上面的解決方案對於不符合匹配字符串的行不是健壯的;那些在開始時不會被剪切,但仍然會在最後兩個字符處剪切。

爲了使它更健壯,也許它會幫助去循環而不是LINQ並添加一些檢查。

下面是如何使用正則表達式創建更強大的表達了兩個例子:

假設你要確保只清理開始與四位線,你可以寫:

string sNew = Regex.Replace(sOld, "[0-9]{4}.*\":\"", ""); 

這意味着刪除所有內容('.*',即任意次數的任何字符),以4位開頭並以'":"'結尾。

要刪除,你可以寫結尾兩個字符:

string sNew = Regex.Replace(sOld, "..$" ""); 

這意味着該行或字符串的最後兩個字符。

如果我們要清理只能用單引號和花,我們可以寫結尾的行:

string sNew = Regex.Replace(sOld, "\"\\}$" ""); 

$再次表示「行或字符串的結尾」。另外請注意,我們如何有兩級逃逸:我們必須逃跑的C#串撇號,我們必須逃跑其他字符,如反斜槓和RegEx裏面的花..

隨着大國也有一些附帶水平的複雜性。這意味着在產品代碼RegExes需要額外的精確和細緻的文檔!

最後一個例子:在你的問題中,最後一行以括號結尾,而不是捲曲。可能是一個錯字,但你可以包括這樣的變體:

string sNew = Regex.Replace(sOld, "[\"}\\]]{2}$", ""); 

你能破譯它嗎?

+0

徹底...好的工作 –

相關問題