2014-10-29 62 views
3

我有以下字符串。從C#中刪除新行字符字符串

string str = @"One 
Two 

Four 
Five 
Six 
Seven 
Eight 




Thirteen 






Twenty 


"; 

我想刪除此字符串中多餘的新行。所以該字符串應該看起來像:

str = "One 
Two 
Four 
Five 
Six 
Seven 
Eight 
Thirteen 
Twenty" 

我正在使用此代碼,但它不起作用。

Str = Str.Replace("\n\n", "\n"); 
      while (Str.IndexOf("\n") > 0) 
      { 
       Str = Str.Replace("\n\n", "\n"); 
      } 

我甚至嘗試過Str = Str.Replace("\u000a\u000a", "\u000a");但仍然沒有解決。

+0

我現在還不確定,是第一個參數regex?如果是的話,這應該工作'Str.Replace(「[\ n] +」,「\ n」);'或者可能包括空格:'Str.Replace(「[] * [\ n] + [] *」 ,「\ n」);' – libik 2014-10-29 16:16:49

回答

7

您可以將字符串分割成線,取出空項,並加入其重新組合:

var lines = str.Split('\n') 
       .Where(s => !string.IsNullOrWhiteSpace(s)); 

str = string.Join("\n", lines); 
+2

+1,但使用'string.IsNullOrWhiteSpace()'而不是'string.IsNullOrEmpty(s.Trim())' – Habib 2014-10-29 16:29:44

+0

@Habib很好的調用! – DavidG 2014-10-29 16:32:57

+0

@DavidG:您的代碼無法正常工作。我遇到錯誤: 1.'string.Join(string,string [])'的最佳重載方法匹配有一些無效參數。 2.參數2:無法從'System.Collections.Generic.IEnumerable '轉換爲'string []'。 – Kamran 2014-10-29 17:25:57

3

試試這個:

str = System.Text.RegularExpressions.Regex.Replace(str, "(" + Environment.NewLine + ")+", Environment.NewLine) 

here更多地瞭解Environment.Newline。但是,即使上面的代碼不保證刪除重複的換行,因爲你在解析文檔或字符串可以在不同的機器上創建其中一個新行的代碼是diferent:

  • "\r\n" - 窗口換行,
  • "\n" - UNIX換行符,
  • "\r「 - MAC換行符

爲了引入到正則表達式,wikipedia文章應該是相當翔實的,但一般:

  • Environment.Newline可以是多種字符,如"\r\n"並且所以我在"()"包圍此變量將其標記爲一個基團,其應被視爲原子字符(單個元件)的,
  • "+"相匹配的前一個元素(Environment.Newline,包含在"()"中)一次或多次。

感謝以上和Regex.Replace我們得到了正確的輸出。

+2

問題在於它沒有處理3個或更多換行符。 – DavidG 2014-10-29 16:17:55

+0

@DavidG更新了答案。 – 2014-10-29 16:33:24

+0

更好,但也許是對外行的正則表達式的解釋? – DavidG 2014-10-29 16:34:32

0

我想你的代碼,並將其掛在一段時間。由於替換將永遠不會擺脫所有的\n實例,這是可以預料的。你想你目前的改變而循環到這一點:

while (str.IndexOf("\n\n") > 0) 
{ 
    str = str.Replace("\n\n", "\n"); 
} 

這將循環,直到\n\n任何重複實例已被刪除。

編輯:我測試過這個和各種案例,只要字符串不以\n\n\n開頭,它就會起作用。