【问题标题】:What is the easiest way in C# to trim a newline off of a string?C# 中从字符串中修剪换行符的最简单方法是什么?
【发布时间】:2009-06-24 12:22:43
【问题描述】:

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

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

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

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

【问题讨论】:

  • 顺便说一句,你可能想要 TrimEnd

标签: c# string


【解决方案1】:

以下对我有用。

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

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

【讨论】:

  • 非常简洁,处理了\r\n问题,不错
  • 虽然修剪构成新行字符的任何字符组合确实解决了潜在问题和问题的精神,但它也留下了一般意义上的不需要的功能的可能性。在文件处理场景中,我可以看到需要将第一个 \n 完整保留在 HeresALineForUnixToBeFedFromWindows\n\r\n 字符串中。虽然更冗长,但 John Skeet 的答案可能是最好的,而 Scott Weinstein 的 ReadLine 也更“准确”(尽管可能开销更​​大)
  • TrimEnd() 已经在做没有任何参数的工作! msdn.microsoft.com/de-de/library/…msdn.microsoft.com/de-de/library/…
  • @Markus 谢谢我发现这个,因为我不想要这种行为,但正在经历它。我的印象 \n 不是空格,但它是 .TrimEnd 和 .Trim 原生清除所有 white space 字符
【解决方案2】:

.Trim() 为我删除了\r\n(使用 .NET 4.0)。

【讨论】:

  • 是的,它确实删除了 \r\n 令人惊讶。到目前为止,我的印象是.Trim() 只会删除两边的空格。
【解决方案3】:

怎么样:

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

【讨论】:

  • 可能是最准确的解决方案,但不是单线 :-)
【解决方案4】:

使用框架。 ReadLine() 方法有以下说法:

一行被定义为一个序列 后跟换行符的字符 ("\n")、回车 ("\r") 或 回车紧随其后 通过换行符(“\r\n”)。字符串 返回的不包含 终止回车或换行 饲料。

所以下面的方法可以解决问题

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

【讨论】:

  • 优雅是的,但对于阅读此行的其他人来说并不容易理解。需要一个解释性评论(当然在同一行中保持单行:))
  • 当字符串多于一行并且您只想删除最后一个空行时不这样做。
【解决方案5】:

怎么样

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

【讨论】:

  • 这与 完全 不一样 - 例如,它会修剪 "abc\n\n\n\n\n",即使 Environment.NewLine是crlf
  • 将其声明为一项功能 :-) 我喜欢这个解决方案。
【解决方案6】:
_content = sb.TrimEnd(Environment.NewLine.ToCharArray());

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

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

【讨论】:

    【解决方案7】:

    怎么样:

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

    这将从字符串的末尾提取所有空白字符——如果您想保留非换行符空白,这只是一个问题。

    【讨论】:

      【解决方案8】:

      有点无法回答,但从字符串中删除换行符的最简单方法是首先在字符串上不包含换行符,确保您自己的代码永远不会看到它。也就是说,通过使用删除换行符的本机函数。如果您逐行要求输出,许多流和文件/io 方法将不包含换行符,但可能需要将某些内容包装在 System.IO.BufferedStream 中。

      System.IO.File.ReadAllLines 之类的东西在大多数情况下都可以用来代替 System.IO.File.ReadAllText,一旦您使用正确类型的流(例如 BufferedStream),就可以使用 ReadLine 代替 Read .

      【讨论】:

        【解决方案9】:

        正如 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 + "'");
            }
        

        【讨论】:

          【解决方案10】:

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

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

          【讨论】:

          • 如果文本中包含不在末尾的新行,这将是一场灾难。
          猜你喜欢
          • 1970-01-01
          • 2010-09-06
          • 1970-01-01
          • 2011-04-04
          • 2012-01-07
          • 2014-11-27
          • 2013-09-24
          • 2016-12-03
          • 2011-06-04
          相关资源
          最近更新 更多