2013-01-24 44 views
2

我有以下代碼:爲什麼從我的逐字字符串中刪除新行只返回最後一行?

string test = @"1 
2 
3"; 

這條線:

Console.WriteLine(test.Replace("\n", "")); //3 

打印 「3」,而不是 「123」,這是我所期待的。爲什麼這個方法只返回我的字符串的最後一行,我怎麼才能刪除所有的新行呢?

+0

如果您要做類似'test = test.Replace.Trim()' – MethodMan

+3

@DJKRAZE會發生什麼情況同樣的事情。 – Servy

回答

7

Console.WriteLine(test.Replace("\n", ""));返回所有數字給我。在處理換行符時,您必須意識到換行符可能是\r\n,這取決於平臺。在這種情況下,你應該這樣做:

test.Replace("\r\n", "") 
// or better: 
test.Replace(Environment.NewLine, "") 

Refrer到Difference between 「\n」 and Environment.NewLine

+0

Verbatium字符串不使用「\ r \ n」它使用源文件的編碼,而理論上可以是任何東西。 –

+0

@JeffWalkerCodeRanger你錯了。所有字符串默認使用'UTF-16',請參考[本文檔頁面](http://msdn.microsoft.com/en-us/library/system.string.aspx#Characters)。C#支持兩種形式的字符串:常規和逐字。兩者都使用相同的編碼。 – Zbigniew

+0

@walkhard是的,所有C#字符串都使用UTF-16編碼。我指的是行結束編碼(即它們是Unix還是PC行尾)。那是「跟隨源文件的編碼」。所以建議的代碼並不是一個安全的方法來從字符串中刪除所有的行結束符。 –

0

逐字字符串使用"\r\n"作爲換行符,所以替換的結果是"1\r2\r3"

如果您改爲使用test.Replace("\r\n", ""),它將按預期工作。要處理任何數量的\r\n的情況,請使用:test.Replace("\r", "").Replace("\n", "")。這將適用於\r,\n\r\n作爲分隔符。

+0

Verbatium字符串不使用「\ r \ n」它使用源文件的編碼,而理論上可能是任何東西。 –

+0

@JeffWalkerCodeRanger是的,它可能是理論上的任何東西,但我知道在這種特殊情況下它實際上是「\ r \ n」,知道「\ n」已被嘗試並失敗,因爲它們是最常用的是使用。此外,我提供的解決方案可以用於「\ n」和「\ r」的任意組合。我不知道任何超出這兩個字符組合的字符作爲換行符的系統。 – Servy

2

在關閉的機會,換行可能會在其撰寫的文本文件,並在其上編譯系統中的系統之間的差異或運行,你可能想要做

string test = @"1 
2 
3"; 
Console.WriteLine(test.Replace(@" 
", ""); 

盡你所能確保您的字符串文字中的換行符與您要替換的換行符相同。

+0

這是正確的假設兩行在同一個源文件中,因爲源代碼中的行尾可以是任何東西。 –

1

逐字字符串使用的源代碼文件,它是鑑於像的Git源控制環境可能行結束轉換爲自然行結束串的行結尾

string test = @"1 
2 
3"; 

可以有任何一套行結尾("\r\n""\r""\n")。以消除任何可能的那些親人團聚的唯一安全的方法是:

Console.WriteLine(test.Replace("\n", "").Replace("\r", "")); 

這使得沒有關於兩段代碼相同的源文件中是假設(因爲兩個源文件不必具有相同的行結束)。

+0

獲得了'逐字串使用它所在源代碼文件的行結尾'的參考嗎?當我看到這種行爲時會很有用 - 即在VS中的開發機器上進行測試傳遞,在從Git獲取TeamCity機器時失敗。 –

+1

@NickBaker我認爲語言規範會說,雖然我認爲它不清楚。我親自測試並驗證了這一點。 –

相關問題