如何从字符串中删除换行符?

216

I have a string in the following format

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'});,但没有帮助。

12个回答

410

我喜欢使用正则表达式。在这种情况下,您可以这样做:

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

在.NET世界中,正则表达式并不像动态语言那样流行,但它们提供了很多操作字符串的强大功能。


1
这绝对是我最好的解决方案。 通过C#和javascript的平稳结合,我成功解决了我的问题。 - Joe Brunscheon
1
我遇到了一个类似的问题,我也需要从字符串中删除换行符。我尝试使用string.Replace来做,但没有成功。当我使用具有完全相同正则表达式字符串作为参数的Regex.Replace时,它起作用了。谢谢。 - instanceof
14
如果在处理一百万个以上的项目的循环中使用这个,请注意谨慎。正则表达式比简单的字符串替换要慢得多。 - Nick
6
这段代码范例还会去除制表符 \t,但这并不是问题所在。 - Michael Freidgeim

85
你想使用 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();
}

10
请注意,这种方法会创建两个中间字符串对象。根据您的字符串大小,这可能会对性能和内存消耗产生重大影响。 - cdhowie

49

很好,支持Mono。 - Nick
4
在跨环境的应用程序中(即从Unix系统提供数据给Windows应用程序),这将带来更多问题而非收益。 - Jakub Szułakiewicz

18
如果速度和低内存使用率很重要,可以像这样做:
var sb = new StringBuilder(s.Length);

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

s = sb.ToString();

是的,我也会选择使用扩展方法。始终使用 StringBuilder 是个好习惯。+1 - RPM1984
4
使用 StringBuilder 总是好的,但这并不完全正确。Jeff Atwood 的一篇博客文章提供了有趣的见解,探讨了字符串操作/连接和优化的问题。文章链接:http://blog.codinghorror.com/the-sad-tragedy-of-micro-optimization-theater/ 。 - Phil Cooper

5

只需这样做

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

3
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'));

3
这里使用了string.Join的通用重载,它将对查询返回的每个char调用ToString。更好的做法是将查询结果直接传递给string构造函数。可以这样写:s1 = new string(s.Where(...).ToArray()); - juharr

2
合适的选择实际上取决于输入字符串的大小和性能、内存需求,但我会使用一个正则表达式,例如:
string result = Regex.Replace(s, @"\r\n?|\n|\t", String.Empty);

如果我们需要多次应用相同的替换,最好使用编译后的Regex版本,例如:

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

注意:不同的场景需要采用不同的方法来实现最佳性能和最小内存消耗。


2

在.NET 6中,可以很容易地使用ReplaceLineEndings来完成此操作:

该方法会搜索字符串中的所有换行序列,并将它们规范化为replacementText提供的换行序列。如果replacementText是Empty,则会删除字符串中的所有换行序列。

请注意,它支持多种类型的换行序列:

识别的换行序列列表包括CR(U+000D)、LF(U+000A)、CRLF(U+000D U+000A)、NEL(U+0085)、LS(U+2028)、FF(U+000C)和PS(U+2029)。此列表由Unicode标准第5.8节的推荐R4和表5-2给出。


0
string remove = Regex.Replace(txtsp.Value).ToUpper(), @"\t|\n|\r", "");

如果您的回答能够提供更多解释,那就太好了。https://stackoverflow.com/help/how-to-answer - Keval Domadia

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]", "");

这似乎是对其他问题的回答...也缺少了实际的参考资料... - Alexei Levenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接