从C#String中删除换行符

时间:2014-10-29 16:09:32

标签: c#

我有以下字符串。

    string str = @"One
Two

Four
Five
Six
Seven
Eight




Thirteen






Twenty


";

我想删除此字符串中的额外新行。这样字符串看起来应该是这样的:

str = "One
Two
Four
Five
Six
Seven
Eight
Thirteen
Twenty"

我正在使用此代码,但它无效。

 Str = Str.Replace("\n\n", "\n");
           while (Str.IndexOf("\n") > 0)
            {
                Str = Str.Replace("\n\n", "\n");
            }

我甚至试过Str = Str.Replace("\u000a\u000a", "\u000a");但是它仍然没有成功。

3 个答案:

答案 0 :(得分:7)

您可以将字符串拆分为行,删除空条目并将其重新连接在一起:

var lines = str.Split('\n')
                .Where(s => !string.IsNullOrWhiteSpace(s));

str = string.Join("\n", lines);

答案 1 :(得分:3)

试试这个:

str = System.Text.RegularExpressions.Regex.Replace(str, "(" + Environment.NewLine + ")+", Environment.NewLine)

请参阅here以了解有关Environment.Newline的更多信息。但即使是上面的代码也不能保证删除重复的换行符,因为您正在解析的文档或字符串可以在不同的机器上创建,其中换行符的代码是不同的:

  • "\r\n" - windows newline,
  • "\n" - unix换行符,
  • "\r" - mac newline

对于正则表达的介绍,wikipedia文章应该是非常有用的,但通常是:

  • Environment.Newline可以是多个字符,例如"\r\n",这就是为什么我将此变量括在"()"中以将其标记为一组字符(单个元素)应该是被视为原子,
  • "+"与前一个元素(Environment.Newline中包含的"()")匹配一次或多次。

由于上面和Regex.Replace,我们得到了所需的输出。

答案 2 :(得分:0)

我尝试了你的代码,它暂时挂起。这是预期的,因为替换永远不会消除所有\n实例。您想要将当前的while循环更改为:

while (str.IndexOf("\n\n") > 0)
{
    str = str.Replace("\n\n", "\n");
}

这将循环,直到删除\n\n的任何重复实例。

编辑:我已经针对各种情况对此进行了测试,只要字符串不以\n\n\n开头,它就可以正常运行。