开发者

How to remove empty lines from a formatted string

How can I remove empty lines in a string in C#?

I am generating some text files in C# (Windows Forms) and for some reason there are some empty lines. How can I remove them after the string is generated (using StringBuilder and TextWrite).

Example text file:

THIS IS A LINE



THIS IS ANOTHER LINE AFTER SOME EMPTY LINES!开发者_运维技巧


If you also want to remove lines that only contain whitespace, use

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

^\s+$ will remove everything from the first blank line to the last (in a contiguous block of empty lines), including lines that only contain tabs or spaces.

[\r\n]* will then remove the last CRLF (or just LF which is important because the .NET regex engine matches the $ between a \r and a \n, funnily enough).


Tim Pietzcker - it is not working for me. I have to change a little bit, but thanks!

Ehhh C# Regex.. I had to change it again, but this it working well:

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

Example: http://regex101.com/r/vE5mP1/2


You could try String.Replace("\n\n", "\n");


Try this

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


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


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


None of the methods mentioned here helped me all the way, but I found a workaround.

  1. Split text to lines - collection of strings (with or without empty strings, also Trim() each string).

  2. Add these lines to multiline string.

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


Based on Evgeny Sobolev's code, I wrote this extension method, which also trims the last (obsolete) line break using 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);
    }
}


I found a simple answer to this problem:

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

Adapted from Marco Minerva [MCPD] at Delete Lines from multiline textbox if it's contain certain string - C#


I tried the previous answers, but some of them with regex do not work right.

If you use a regex to find the empty lines, you can’t use the same for deleting.

Because it will erase "break lines" of lines that are not empty.

You have to use "regex groups" for this replace.

Some others answers here without regex can have performance issues.

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


This pattern works perfect to remove empty lines and lines with only spaces and/or tabs.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜