2011-12-06 94 views
1

我正在使用WinForms NET 2.0。我正在編寫一個小函數來修剪某些選定文本的註釋。它所做的是將所選文本分爲單獨的行,然後:C#刪除字符串中的註釋

  • 如果行不包含註釋,則會附加它。
  • 如果該行包含一些文本後跟註釋,則會附加修剪的註釋。
  • 如果該行以註釋開頭,則不會被追加。這是在if語句中。
  • 如果該行爲空白,則不會被追加。這也在if語句中。

這裏是我的代碼:

 string[] lines = tb.SelectedText.Split('\n'); 
     StringBuilder sb = new StringBuilder(); 

     for (int i = 0; i < lines.Length; i++) 
     { 
      if ((lines[i].Trim() != string.Empty) || !Regex.IsMatch(lines[i], @"^\s*;(.*)$")) 
      { 
       if (Regex.IsMatch(lines[i], @"^(.*);(.*)$")) 
        sb.AppendLine(lines[i].Substring(0, lines[i].IndexOf(';')).Trim()); 
       else 
        sb.AppendLine(lines[i]); 
      } 
     } 
     tb.SelectedText = sb.ToString(); 

的問題是,因爲預期它不工作。假設,如果我有以下文字:

test ;test 

test2 ;test 

我希望它可以修剪的意見和刪除空行,但沒有,空行仍然存在。爲什麼是這樣?我檢查了這行是否爲空,所以StringBuilder不應該追加行,如果它是空白的,但由於某種原因,它不會。

另外,由於某種原因,stringbuilder追加了一行。如何擺脫這一點?

+0

在'tb.SelectedTExt'是'\ n'絕對唯一的換行符?例如,它不是'\ r \ n'? –

+0

它總是\ n。 – david

回答

3

替換||在if語句中& &並使用「\ r \ n」而不是「\ n」。試試這個:

var lines = textBox2.SelectedText.Split(new [] {"\r\n"}, StringSplitOptions.None); 
var sb = new StringBuilder(); 

for (int i = 0; i < lines.Length; i++) 
{ 
    var line = lines[i].Trim(); 
    if ((line != string.Empty) && !Regex.IsMatch(line, @"^\s*;(.*)$")) 
    { 
     if (Regex.IsMatch(line, @"^(.*);(.*)$")) 
      sb.AppendLine(line.Substring(0, line.IndexOf(';')).Trim()); 
     else 
      sb.AppendLine(line); 
    } 
} 
textBox2.SelectedText = sb.ToString(); 

或者與LINQ和 「?」 表示:

var lines = textBox2.SelectedText .Split(new [] {"\r\n"}, StringSplitOptions.None); 
var sb = new StringBuilder(); 

foreach (var line in lines.Select(t => t.Trim()) 
          .Where(line => (line != string.Empty) && !Regex.IsMatch(line, @"^\s*;(.*)$"))) 
{ 
    sb.AppendLine(Regex.IsMatch(line, @"^(.*);(.*)$") ? line.Substring(0, line.IndexOf(';')).Trim() : line); 
} 
textBox2.SelectedText = sb.ToString(); 
+0

完美的作品,謝謝。順便說一句,你會碰巧知道爲什麼StringBuilder會追加一個額外的行嗎?當我替換文本時,會添加額外的行。 – david

+0

+1,因爲你更快,併爲Linq解決方案。 – stema

+1

由於您調用方法AppendLine(),所以添加了額外的行。如果你調用Append(),這不會發生,但你必須在for循環中提供一個換行符來保留輸入的行。或者從結果中刪除最後一個換行符。 – Abbas

1

你有一個問題在這裏你的邏輯

if ((lines[i].Trim() != string.Empty) || !Regex.IsMatch(lines[i], @"^\s*;(.*)$")) { 
    if (Regex.IsMatch(lines[i], @"^(.*);(.*)$")) 
     sb.AppendLine(lines[i].Substring(0, lines[i].IndexOf(';')).Trim()); 
    else 
     sb.AppendLine(lines[i]); 
} 

您進入if當字符串不爲空它與正則表達式不匹配。這意味着您始終輸入它,因爲當第一部分爲假(字符串爲空)時,第二部分爲真(空字符串與您的正則表達式不匹配。)

只需將AND替換爲AND 。

+0

是的,現在我再次看它,這是沒有意義的。順便說一句,你會碰巧知道爲什麼StringBuilder會追加一個額外的行嗎? – david