2010-11-10 88 views
106

我有以下格式如何從字符串中刪除換行符?

string s = "This is a Test String.\n This is a next line.\t This is a tab.\n' 

我想從上面的字符串中刪除的\n\r所有出現的字符串。

我試過string s = s.Trim(new char[] {'\n', '\r'});但它沒有幫助。

回答

194

我喜歡使用正則表達式。在這種情況下,你可以這樣做:

string replacement = Regex.Replace(s, @"\t|\n|\r", ""); 

正則表達式並不像流行的.NET世界,因爲它們是在動態語言,但它們提供了大量的電力來操作字符串。

+0

這對我來說絕對是最好的解決方案。這個C#和JavaScript的平滑混合是我需要解決我的問題。 – 2013-11-26 19:30:20

+0

我有一個類似的問題,我也需要從我的字符串中刪除換行符。我試圖用string.Replace做到這一點,沒有奏效。當我使用與參數完全相同的正則表達式字符串的Regex.Replace時,它工作正常。謝謝。 – instanceof 2016-01-26 08:57:43

+4

如果在處理1M +項目的循環中使用它,請小心。正則表達式比只是String.Replace – Nick 2016-06-23 16:02:34

51

你想使用String.Replace刪除一個字符。

s = s.Replace("\n", String.Empty); 
s = s.Replace("\r", String.Empty); 
s = s.Replace("\t", String.Empty); 

注意String.Trim(params char[] trimChars)能消除開頭和結尾在trimChars從實例調用的字符上。

你可以做一個擴展方法,避免了上述製造大量的臨時字符串的性能問題:

static string RemoveChars(this string s, params char[] removeChars) { 
    Contract.Requires<ArgumentNullException>(s != null); 
    Contract.Requires<ArgumentNullException>(removeChars != null); 
    var sb = new StringBuilder(s.Length); 
    foreach(char c in s) { 
     if(!removeChars.Contains(c)) { 
      sb.Append(c); 
     } 
    } 
    return sb.ToString(); 
} 
+6

請注意,這種方法將創建兩個中間字符串對象。根據字符串的大小,這可能會導致顯着的性能和內存消耗。 – cdhowie 2010-11-10 02:37:32

10

如果速度和低內存佔用是重要的,做這樣的事情:

var sb = new StringBuilder(s.Length); 

foreach (char i in s) 
    if (i != '\n' && i != '\r' && i != '\t') 
     sb.Append(i); 

s = sb.ToString(); 
+0

是的,我也會這樣做(在擴展方法中)。總是很好地使用StringBuilder。 +1 – RPM1984 2010-11-10 02:39:03

+2

「總是很好地使用StringBuilder」<我不是專業人士,但這不是真的。本文[Jeff Atwood的文章](http://blog.codinghorror.com/the-sad-tragedy-of-micro-optimization-theater/)提供了對字符串操作/串聯以及最終優化的有趣見解。 – 2014-07-01 09:29:46

-2

FYI,

Trim()已經做到了。

下LINQPad樣本:

void Main() 
{ 
    var s = " \rsdsdsdsd\nsadasdasd\r\n "; 
    s.Length.Dump(); 
    s.Trim().Length.Dump(); 
} 

輸出:

23 
18 
+4

慢,這不會刪除\ n在中間。 – FlappySocks 2015-09-26 16:23:59

3

只是做

s = s.Replace("\n", String.Empty).Replace("\t", String.Empty).Replace("\r", String.Empty); 
-2

您可以使用Trim,如果你想從起點和終點刪除。

string stringWithoutNewLine = "\n\nHello\n\n".Trim(); 
+0

這會解決問題中指定的問題嗎? – 2016-02-23 13:29:54

2

一個LINQ方法:

string s = "This is a Test String.\n This is a next line.\t This is a tab.\n'"; 

string s1 = String.Join("", s.Where(c => c != '\n' && c != '\r' && c != '\t')); 
+0

這是使用'string.Join'的泛型重載,它會在查詢返回的每個'char'上調用'ToString'。最好將查詢結果傳遞給'string'構造函數。 's1 = new string(s.Where(....)。ToArrary());' – juharr 2017-01-05 14:29:51

0

正確的選擇真的取決於輸入字符串有多大,什麼Perforce公司和內存的要求是,但我會用正則表達式像

string result = Regex.Replace(s, @"\r\n?|\n|\t", String.Empty); 

或者如果我們需要多次應用相同的替換,最好使用正則表達式的編譯版本,如

var regex = new Regex(@"\r\n?|\n|\t", RegexOptions.Compiled); 
string result = regex.Replace(s, String.Empty); 

注:不同的場景報復不同的方法,以達到最佳的性能和最小的內存消耗

0

嗯......我想你理解的空間更加具體的領域。 \t實際上被分類爲水平空間,而不是垂直空間。 (測試在記事本中插入\t

如果使用Java,只需使用\v即可。請參閱下面的參考。

\h - 一個水平空白字符:

[\t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]

\v - 垂直空白字符:

[\n\x0B\f\r\x85\u2028\u2029]

但據我所知,您使用.NET。所以我的答案是替換每個垂直空間。

string replacement = Regex.Replace(s, @"[\n\u000B\u000C\r\u0085\u2028\u2029]", ""); 
+0

它看起來像一個其他問題的答案...也缺少實際參考... – 2017-08-23 07:25:14