Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从格式化字符串中删除空行_C#_Regex_String_Stringbuilder - Fatal编程技术网

C# 如何从格式化字符串中删除空行

C# 如何从格式化字符串中删除空行,c#,regex,string,stringbuilder,C#,Regex,String,Stringbuilder,如何在C#中删除字符串中的空行 我正在用C#(Windows窗体)生成一些文本文件,由于某些原因,其中有一些空行。生成字符串后如何删除它们(使用and) 示例文本文件: THIS IS A LINE THIS IS ANOTHER LINE AFTER SOME EMPTY LINES! 试试这个 Regex.Replace(subjectString, @"^\r?\n?$", "", RegexOptions.Multiline); 您可以尝试String.Replace(“\n\

如何在C#中删除字符串中的空行

我正在用C#(Windows窗体)生成一些文本文件,由于某些原因,其中有一些空行。生成字符串后如何删除它们(使用and)

示例文本文件:

THIS IS A LINE



THIS IS ANOTHER LINE AFTER SOME EMPTY LINES!
试试这个

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

您可以尝试
String.Replace(“\n\n”,“\n”)

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

resultString = Regex.Replace(subjectString, @"^\s+$[\r\n]*", string.Empty, RegexOptions.Multiline);
^\s+$
将删除从第一个空行到最后一个空行(在连续的空行块中)的所有内容,包括仅包含制表符或空格的行

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

不适合我。我得换一点,但是谢谢

呃#正则表达式。。我不得不再换一次,但这很好:

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

此模式非常适用于删除空行和只有空格和/或制表符的行

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

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

YourradTextBox.Lines = YourradTextBox.Lines.Where(p => p.Length > 0).ToArray();
根据Marco Minerva[MCPD]在

上的改编,我编写了这个扩展方法,它还使用TrimEnd(TrimNewLineChars)修剪最后一个(过时的)换行符:


我尝试了前面的答案,但其中一些与正则表达式不工作的权利

如果使用正则表达式查找空行,则不能将其用于删除

因为它将删除非空行的“中断行”

您必须使用“正则表达式组”进行此替换

其他一些没有regex的答案可能会有性能问题

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

这里提到的方法都没有一个对我有帮助,但我找到了一个解决办法

  • 将文本拆分为行-字符串的集合(带或不带空字符串,也包括修剪()每个字符串)

  • 将这些行添加到多行字符串

     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);
     }
    
    public static IEnumerable SplitToLines(此字符串inputText,bool removemptylines=true)
    {
    如果(inputText==null)
    {
    屈服断裂;
    }
    使用(StringReader=新StringReader(inputText))
    {
    弦线;
    而((line=reader.ReadLine())!=null)
    {
    if(removeMptylines&&!string.IsNullOrWhiteSpace(行))
    屈服返回线。修剪();
    其他的
    屈服返回线。修剪();
    }
    }
    }
    公共静态字符串到MultilineText(此字符串文本)
    {
    var lines=text.SplitToLines();
    返回string.Join(Environment.NewLine,lines);
    }
    


  • 在一代人之后删除这些行真的是你想要做的吗?我想你应该看看为什么要生成额外的行。如果您使用WriteLine(…)方法,它们将为您编写新行。Write(…)方法不会写入新的行序列。这不是我的错,我正在从一些文本文件中提取文本,这就是问题所在!谢谢,但这不是一个通用的解决方案,不包括标签、空格和诸如此类的东西。你的问题没有提到这一点。事实上,你特别说了“空行”。我也在上面钉了
    Trim()
    。但是,它在
    \n\n\n
    的情况下仍然不起作用。实际上,这并不能解决所有空行。我面临着一种情况,当我有可变数量的端点一起走。因此,在这种情况下,我们需要在文本中迭代多次。这几乎可以实现,但是我有一个问题:最后一行是空的,并且没有删除。我的正则表达式很差,所以我不知道为什么?@RobinRye:这是因为它至少需要一个空格字符来匹配。如果您将
    \s+
    更改为
    \s*
    ,那么它也应该删除最后一行。谢谢Tim,我在研究了一点正则表达式后也这么认为,但没有帮助。已更改为\s*,但结果字符串中仍保留最后一行。我使用str.Trim()删除它。这也删除了最后一个空行:Regex.Replace(subjectString,@“[\r\n]*^\s*$[\r\n]*”,“”,RegexOptions.Multiline)@戴安娜:这可能有副作用。在某些情况下,许多“换行符”会使用此方法删除。请在此处添加说明您有性能问题。考虑用一个字符串100万来测试你的方法,里面有代码< > \n>代码>。考虑使用<代码> StringBuilder <代码>而不是+String,我认为调用函数ReaveVeleType更为合理。一个解释是,AppEdTrn在返回的字符串末尾追加一个空行。@ ToMas-Galigele,这是意图。“拆分”将从行的末尾删除换行符,因此您需要将其添加回,否则您的所有行都将变成一行!唯一的问题是
    Environment。换行符
    是一个字符串,无法放入字符数组。只有当所讨论的字符串来自同一个系统时,您的扩展才能工作。如果它在lnux、web到windows等系统之间传输,则根本无法工作。考虑将TrimeNexLARCARS转换为实际的ARARYI,我不知道你的意思。你可以发布一个无法工作的示例字符串,我将用它编写一个单元测试。谢谢。请在文本文件中试用它,其中的是CR+LF()、LF()和(经典,在Max OS X之前)(CR)。=ASCII 13。[LF]()=ASCII 10。这就是AaA暗示的
    Environment.NewLine
    仅在使用当前系统的默认行结束顺序创建文件时有效。大多数高级文本编辑器都可以处理/设置/保存格式(通过右下角给定文件的隐藏功能(如“LF”)并在此处进行更改)。请在投票否决所有人之前仔细阅读问题。
    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);
        }
    }
    
        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();
        }
    
     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);
     }