有效地从多行字符串中删除所有空白行

Fun*_*der 30 c# regex string

在C#中,删除空行的最佳方法是什么,即只包含字符串空格的行?如果这是最好的解决方案,我很高兴使用正则表达式.

编辑:我应该添加我使用.NET 2.0.


赏金更新:奖励之后我会回滚,但我想澄清一些事情.

首先,任何Perl 5 compat正则表达式都可以.这不仅限于.NET开发人员.标题和标签已经过编辑以反映这一点.

其次,虽然我在赏金细节中给出了一个简单的例子,但它并不是你必须满足的唯一测试.您的解决方案必须删除空格以外的所有行,以及最后一行换行符.如果有一个字符串,在运行正则表达式后,以"/ r/n"或任何空白字符结尾,则会失败.

Chr*_*ich 20

如果要删除包含任何空格(制表符,空格)的行,请尝试:

string fix = Regex.Replace(original, @"^\s*$\n", string.Empty, RegexOptions.Multiline);
Run Code Online (Sandbox Code Playgroud)

编辑(对于@Will):修剪尾随换行符的最简单的解决方案是TrimEnd在结果字符串上使用,例如:

string fix =
    Regex.Replace(original, @"^\s*$\n", string.Empty, RegexOptions.Multiline)
         .TrimEnd();
Run Code Online (Sandbox Code Playgroud)

  • @ChrisSchmich:是的,纯正的正则表达式.如果内存中有多个100mb字符串,则不希望创建仅以"/ r/n"不同的新实例.如果我可以一次性获得它,我可以更容易地休息一下内存压力. (2认同)

Tho*_*que 16

string outputString;
using (StringReader reader = new StringReader(originalString)
using (StringWriter writer = new StringWriter())
{
    string line;
    while((line = reader.ReadLine()) != null)
    {
        if (line.Trim().Length > 0)
            writer.WriteLine(line);
    }
    outputString = writer.ToString();
}
Run Code Online (Sandbox Code Playgroud)

  • 难道这不应该是`if(line.Trim().Length> 0)writer.WriteLine(line)`?OP没有要求在输出字符串中修剪所有行. (2认同)

Sky*_*ers 13

脱离我的头顶......

string fixed = Regex.Replace(input, "\s*(\n)","$1");
Run Code Online (Sandbox Code Playgroud)

转过来:

fdasdf
asdf
[tabs]

[spaces]  

asdf


进入这个:

fdasdf
asdf
asdf

  • 如果文本以几个空行开头"\ r \n\r \n \nfailure!",这实际上会失败! (2认同)

dtb*_*dtb 8

使用LINQ:

var result = string.Join("\r\n",
                 multilineString.Split(new string[] { "\r\n" }, ...None)
                                .Where(s => !string.IsNullOrWhitespace(s)));
Run Code Online (Sandbox Code Playgroud)

如果您正在处理大输入和/或不一致的行结尾,则应使用StringReader并使用foreach循环执行上述old-school.

  • 我最近用Linq来解冻我的冰箱.当Linq这么酷的时候,为什么要用旧方式做点什么呢? (5认同)
  • LINQ什么时候成为新的正则表达式? (4认同)
  • 啊确实隐藏在那里.在这种情况下,除非您使用的是.NET 4.0,否则需要.ToArray().在我看来,这比正则表达式的可读性差得多,我不确定你在这种方法中真正获得了什么. (2认同)