从C#字符串中删除换行符

3
我有以下字符串。
    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"); 但仍然无效。


我现在不确定,第一个参数是正则表达式吗?如果是的话,这应该可以工作:Str.Replace("[\n]+", "\n"); 或者可能包括空格:Str.Replace("[ ]*[\n]+[ ]*", "\n"); - libik
3个回答

7
您可以将字符串拆分成多行,删除空白项并重新连接起来:
var lines = str.Split('\n')
                .Where(s => !string.IsNullOrWhiteSpace(s));

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

2
使用string.IsNullOrWhiteSpace()代替string.IsNullOrEmpty(s.Trim()),加一。 - Habib
@DavidG:你的代码没有正常工作。我遇到了以下错误: 1.最佳重载方法匹配“string.Join(string, string[])”有一些无效的参数。 2.参数2:无法将“System.Collections.Generic.IEnumerable<string>”转换为“string[]”。 - Kamran
@Kami,我刚刚按照上面写的粘贴了代码,它可以运行。也许你缺少一个导入,加上 using System.Linq; 试试? - DavidG
1
@DavidG:感谢您的评论。我找到了问题所在。我正在使用Dot Net版本3.5。我将更新目标框架到版本4。 - Kamran

3

试试这个:

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

点击此处了解有关Environment.Newline的更多信息。但是,即使是上面的代码也不能保证删除重复换行符,因为您正在解析的文档或字符串可能是在不同机器上创建的,在那里用于换行的代码是不同的:
  • "\r\n" - Windows 换行,
  • "\n" - Unix 换行,
  • "\r" - Mac 换行

如果需要正则表达式的介绍,请参考维基百科文章,但一般来说:

  • Environment.Newline 可以由多个字符组成,例如 "\r\n",这就是为什么我将该变量括在 "()" 中,以将其标记为应视为原子(单个元素)的字符组,
  • "+" 匹配前面的元素(Environment.Newline 括在 "()" 中)一次或多次。
有了以上知识和Regex.Replace,我们就可以得到完全符合要求的输出结果。

2
这个问题在于它无法处理三个或更多的换行符。 - DavidG
@DavidG 更新了答案。 - Michal Hosala
更好,但也许需要为未接触过正则表达式的人解释一下它的含义? - DavidG
@Kami,我已经查看了你更新后的问题,仍然不明白为什么我的答案对你来说不好,因为它提供了所需的输出。能否请你详细解释一下? - Michal Hosala
@Kami,那么你可能没有使用标准的Windows换行符\r\n,而是使用了\n。如果是这样,那么只需将上面代码中的Environment.NewLine替换为"\n",它应该可以正常工作。 - Michal Hosala
显示剩余2条评论

0

我尝试了你的代码,它在 while 循环中卡住了。这是可以预料的,因为替换永远无法摆脱所有的 \n 实例。你需要将当前的 while 循环更改为以下内容:

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

这将循环执行,直到所有重复的 \n\n 实例被删除。

编辑:我已经测试过了,对于各种情况都可以正常工作,只要字符串不以 \n\n\n 开头。


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