用C#修剪字符串中的换行符最简单的方法是什么?


115

我想确保_content不以换行符结尾:

_content = sb.ToString().Trim(new char[] { Environment.NewLine });

但是上面的代码不起作用,因为Trim似乎没有字符串集合(只有字符)的重载参数。

从字符串末尾删除Enivronment.Newline的最简单的单行代码是什么?


4
顺便说一句,您可能想要TrimEnd
Marc Gravell

Answers:


260

以下对我有用。

sb.ToString().TrimEnd( '\r', '\n' );

要么

sb.ToString().TrimEnd( Environment.NewLine.ToCharArray());

非常简洁,可以处理\ r \ n问题,很好
Edward Tanguay 2009年

1
修剪构成新行字符的字符的任何组合确实可以解决潜在的问题和问题的实质,但从一般意义上讲,它还可能留下不需要的功能。在文件处理工具中,我可以看到需要将第一个\ n完整保留在HeresALineForUnixToBeFedFromWindows \ n \ r \ n的字符串中。虽然较为冗长,但John Skeet的答案可能是最好的,Scott Weinstein的ReadLine也更“准确”(尽管可能会有更多开销)
b_levitt 2013年

26
TrimEnd()已经在没有任何参数的情况下执行作业了!msdn.microsoft.com/de-de/library/…msdn.microsoft.com/de-de/library/…–
Markus

3
@Markus谢谢,我找到了这个,因为我不想要这种行为,但是正在经历它。我给人的印象是\ n不是空格,而是.TrimEnd和.Trim本地清除所有空格字符
David Carrigan


14

怎么样:

public static string TrimNewLines(string text)
{
    while (text.EndsWith(Environment.NewLine))
    {
        text = text.Substring(0, text.Length - Environment.NewLine.Length);
    }
    return text;
}

如果有多个换行符,效率较低,但是会起作用。

或者,如果您不介意修剪(例如)"\r\r\r\r""\n\n\n\n"而不仅仅是"\r\n\r\n\r\n"

// No need to create a new array each time
private static readonly char[] NewLineChars = Environment.NewLine.ToCharArray();

public static string TrimNewLines(string text)
{
    return text.TrimEnd(NewLineChars);
}

1
可能是最准确的解决方案,但不是单一方法:-)
bang

9

使用框架。ReadLine()方法具有以下含义:

一行定义为一个字符序列,后跟换行符(“ \ n”),回车符(“ \ r”)或回车符后紧跟换行符(“ \ r \ n”)。返回的字符串不包含回车符或换行符。

因此,以下将解决问题的技巧

_content = new StringReader(sb.ToString()).ReadLine();

1
优雅,是的,但对于其他阅读此行的人来说不容易理解。需要
解释性的

1
当字符串有多行并且您只想删除最后一个空行时,则不会。
Florian Berger

6

关于什么

_content = sb.ToString().Trim(Environment.NewLine.ToCharArray());

这样做的功能不尽相同-例如,即使Environment.NewLine是crlf,它也会修剪“ abc \ n \ n \ n \ n \ n”
Marc Gravell

1
宣布它为功能:-)我喜欢这种解决方案。
Stefan Steinegger,2009年

5
_content = sb.TrimEnd(Environment.NewLine.ToCharArray());

当然,这将删除“ \ r \ r \ r \ r”以及“ \ n \ n \ n \ n”和其他组合。在“换行”不是“ \ n \ r”的“环境”中,您可能会得到一些奇怪的行为:-)

但是,如果您可以接受,那么我相信这是在字符串末尾删除换行符的最有效方法。


3

怎么样:

string text = sb.ToString().TrimEnd(null)

这将从字符串末尾拉出所有空格字符-仅当您想保留非换行符空格时才出现问题。


1

某种程度上不能回答,但是最简单的从字符串中删除换行符的方法是,首先确保在您的代码中永远不会看到换行符,否则就不用在字符串上换行了。即,通过使用删除换行符的本机函数。如果您要求逐行输出,许多流和文件/ io方法将不包括换行符,尽管可能需要将某些内容包装在中System.IO.BufferedStream

诸如此类的事情System.IO.File.ReadAllLines可以在System.IO.File.ReadAllText大多数时间使用,并且ReadLine可以代替Read使用正确类型的流(例如BufferedStream)来使用。


0

正如Markus指出的那样,TrimEnd现在正在做这项工作。我需要在Windows Phone 7.8环境中从字符串的两端获取换行符和空格。在尝试了其他更复杂的选项之后,仅使用Trim()解决了我的问题-顺利通过了以下测试

   [TestMethod]
    [Description("TrimNewLines tests")]
    public void Test_TrimNewLines()
    {
        Test_TrimNewLines_runTest("\n\r     testi    \n\r", "testi");
        Test_TrimNewLines_runTest("\r     testi    \r", "testi");
        Test_TrimNewLines_runTest("\n     testi    \n", "testi");
        Test_TrimNewLines_runTest("\r\r\r\r\n\r     testi   \r\r\r\r \n\r", "testi");
        Test_TrimNewLines_runTest("\n\r  \n\n\n\n   testi äål.,    \n\r", "testi äål.,");
        Test_TrimNewLines_runTest("\n\n\n\n     testi  ja testi  \n\r\n\n\n\n", "testi  ja testi");
        Test_TrimNewLines_runTest("", "");
        Test_TrimNewLines_runTest("\n\r\n\n\r\n", "");
        Test_TrimNewLines_runTest("\n\r \n\n \n\n", "");
    }

    private static void Test_TrimNewLines_runTest(string _before, string _expected)
    {
        string _response = _before.Trim();
        Assert.IsTrue(_expected == _response, "string '" + _before + "' was translated to '" + _response + "' - should have been '" + _expected + "'");
    }

-2

我必须删除整个文本中的新行。所以我用了:

            while (text.Contains(Environment.NewLine))
            {
                text = text.Substring(0, text.Length - Environment.NewLine.Length);
            }

1
如果文本包含末尾的换行符,这将是一场灾难。
Stefan Bergfeldt
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.