如何从格式化的字符串中删除空行?

时间:2011-10-04 12:14:37

标签: c# regex string stringbuilder

如何在C#中删除字符串中的空行?我在C#(winforms)中生成一些文本文件,由于某种原因,有一些空行。如何在生成字符串后删除它们(使用StringBuilderTextWrite)。

示例文本文件:

THIS IS A LINE



THIS IS ANOTHER LINE AFTER SOME EMPTY LINES!

感谢。

11 个答案:

答案 0 :(得分:73)

如果您还想删除仅包含空格的行,请使用

resultString = Regex.Replace(subjectString, @"^\s+$[\r\n]*", string.Empty, RegexOptions.Multiline);

^\s+$将删除从第一个空白行到最后一行(在连续的空行块中)的所有内容,包括仅包含制表符或空格的行。

然后

[\r\n]*将删除最后一个CRLF(或者只是LF,这很重要,因为.NET正则表达式引擎与$\r之间的\n匹配,很有趣足够)。

答案 1 :(得分:13)

@Tim Pietzcker - 不适合我。我必须改变一点但是thx!
Ehhh C#Regex ..我不得不再次改变它,但这很有效:

private string RemoveEmptyLines(string lines)
{
  return Regex.Replace(lines, @"^\s*$\n|\r", string.Empty, RegexOptions.Multiline).TrimEnd();
}

实施例: http://regex101.com/r/vE5mP1/2

答案 2 :(得分:7)

您可以尝试String.Replace("\n\n", "\n");

答案 3 :(得分:3)

试试这个

Regex.Replace(subjectString, @"^\r?\n?$", "", RegexOptions.Multiline);

答案 4 :(得分:1)

    private string remove_space(string st)
    {
        String final = "";

        char[] b = new char[] { '\r', '\n' };
        String[] lines = st.Split(b, StringSplitOptions.RemoveEmptyEntries);
        foreach (String s in lines)
        {
            if (!String.IsNullOrWhiteSpace(s))
            {
                final += s;
                final += Environment.NewLine;
            }
        }

        return final;

    }

答案 5 :(得分:0)

private static string RemoveEmptyLines(string text)
{
    var lines = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

    var sb = new StringBuilder(text.Length);

    foreach (var line in lines)
    {
        sb.AppendLine(line);
    }

    return sb.ToString();
}

答案 6 :(得分:0)

基于Evgeny Sobolev的代码,我编写了此扩展方法,该方法还使用TrimEnd(TrimNewLineChars)修剪了最后一个(过时的)换行符。

public static class StringExtensions
{
    private static readonly char[] TrimNewLineChars = Environment.NewLine.ToCharArray();

    public static string RemoveEmptyLines(this string str)
    {
        if (str == null)
        {
            return null;
        }

        var lines = str.Split(TrimNewLineChars, StringSplitOptions.RemoveEmptyEntries);

        var stringBuilder = new StringBuilder(str.Length);

        foreach (var line in lines)
        {
            stringBuilder.AppendLine(line);
        }

        return stringBuilder.ToString().TrimEnd(TrimNewLineChars);
    }
}

答案 7 :(得分:0)

我尝试了上面的答案,但是其中一些使用正则表达式无法正常工作。

如果使用正则表达式查找空行,则不能使用相同的空行删除。

因为它将清除不为空的行的“断行”。

此替换必须使用“正则表达式组”。

这里有些没有正则表达式的答案可能会出现性能问题。

    private string remove_empty_lines(string text) {
        StringBuilder text_sb = new StringBuilder(text);
        Regex rg_spaces = new Regex(@"(\r\n|\r|\n)([\s]+\r\n|[\s]+\r|[\s]+\n)");
        Match m = rg_spaces.Match(text_sb.ToString());
        while (m.Success) {
            text_sb = text_sb.Replace(m.Groups[2].Value, "");
            m = rg_spaces.Match(text_sb.ToString());
        }
        return text_sb.ToString().Trim();
    }

答案 8 :(得分:0)

这里没有提到的方法一直对我有帮助,但是我找到了解决方法。

  1. 将文本分割成几行-字符串集合(有或没有空字符串,每个字符串还有 Trim())。
  2. 将这些行添加到多行字符串中。

{}

public static IEnumerable<string> SplitToLines(this string inputText, bool removeEmptyLines = true)
{
    if (inputText == null)
    {
        yield break;
    }

    using (StringReader reader = new StringReader(inputText))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            if (removeEmptyLines && !string.IsNullOrWhiteSpace(line))
                yield return line.Trim();
            else
                yield return line.Trim();
        }
    }
}

public static string ToMultilineText(this string text)
{
    var lines = text.SplitToLines();

    return string.Join(Environment.NewLine, lines);
}

答案 9 :(得分:-1)

此模式非常适合删除仅包含空格和/或制表符的空行和空行。

s = Regex.Replace(s, "^\s*(\r\n|\Z)", "", RegexOptions.Multiline)

答案 10 :(得分:-1)

我找到了这个问题的简单答案

YourradTextBox.Lines = YourradTextBox.Lines.Where(p => p.Length > 0).ToArray();

改编自Marco Minerva [MCPD]:https://social.msdn.microsoft.com/Forums/windows/en-US/b1bb4107-4ad5-4cd3-bd20-9c2b3f9b31a6/delete-lines-from-multiline-textbox-if-its-contain-certain-string-c?forum=winforms&prof=required