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


184

我有以下格式的字符串

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

Answers:


334

我喜欢使用正则表达式。在这种情况下,您可以执行以下操作:

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

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


这绝对是我的最佳解决方案。解决此问题只需要将C#和javascript顺利融合即可。
Joe Brunscheon,

我有一个类似的问题,我还需要从字符串中删除换行符。我试图用string.Replace,没有用。当我使用正则表达式字符串与参数完全相同的Regex.Replace时,它起作用了。谢谢。
instanceof

9
如果在处理1M +件物品的循环中使用它,请小心。正则表达式比String.Replace慢得多
尼克

该代码示例还将删除选项卡\ t,这是没有问题的。
Michael Freidgeim

72

您要用于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();
}

8
请注意,此方法将创建两个中间字符串对象。根据字符串的大小,这可能会导致明显的性能和内存消耗后果。
cdhowie 2010年


15

如果速度和低内存使用很重要,请执行以下操作:

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 '11

4
“总是很好使用StringBuilder” <我不是专业人士,但是严格来说并非如此。杰夫·阿特伍德(Jeff Atwood)的这篇文章提供了有关字符串操作/串联以及最终优化的有趣见解。
Phil Cooper


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

2
这使用了泛型重载string.Join,它将ToStringchar查询返回的每个重载进行调用。最好只将查询结果传递给string构造函数。 s1 = new string(s.Where(....).ToArrary());
juharr

0

正确的选择实际上取决于输入字符串的大小以及perforce和内存的要求,但是我会使用如下正则表达式

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

注意:不同的方案要求使用不同的方法来获得最佳性能和最小的内存消耗


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


-4

Trim如果要从开头和结尾删除,则可以使用。

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

-6

仅供参考

Trim()已经做到了。

以下LINQPad示例:

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

输出:

23
18

5
但这不会删除中间的\ n。
FlappySocks 2015-09-26
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.