从StringBuilder中删除连续的空行

时间:2010-07-08 16:29:40

标签: c#

我有一个已从文本文件填充的Stringbuilder对象。 如何检查StringBuilder对象并删除连续的“空白”行。

Line 1: This is my text
Line 2:
Line 3: Another line after the 1st blank one
Line 4: 
Line 5:
Line 6: Next line after 2 blank lines

(行号仅供参考)

第2行的空白行很好,但我想在第5行删除重复的空白行,依此类推。

如果为了论证,第6行也是一个空白行,并且第7行有一个值,我想删除空白行5和空白行6,这样第3行之间只有1个空白行和第7行。

提前致谢。

3 个答案:

答案 0 :(得分:3)

你必须已经在StringBuilder中拥有文件内容吗?

能够逐行阅读会更好。类似的东西:

private IEnumerable<string> GetLinesFromFile(string fileName)
{
  using (var streamReader = new StreamReader(fileName))
  {
    string line = null;
    bool previousLineWasBlank = false;
    while ((line = streamReader.ReadLine()) != null)
    {
      if (!previousLineWasBlank && string.IsNullOrEmpty(line))
      {
        yield return line;
      }

      previousLineWasBlank = string.IsNullOrEmpty(line);
    }
  }
}

现在,你可以阅读你的文字(已删除了重叠空白行),如下所示:

foreach (var line in GetLinesFromFile("myFile.txt"))
{
  Console.WriteLine(line);
}

注意:我只是在这里说明一种技巧。还有其他考虑因素:例如我的迭代器方法在消费者处理foreach时保持文件打开。这很好并且内存效率高(例如,比读取字符串更多),因为您一次只处理一行,但不适合需要很长时间处理的文件。

答案 1 :(得分:3)

可能效率不高,但很容易。

while(sb.ToString().Contains(Environment.NewLine + Environment.NewLine))
{
    sb = sb.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine);
}

答案 2 :(得分:2)

StringBuilder在搜索和搜索方面不够灵活。从中删除。它被用作帮助加速连接,因为"string" + "another string"是一项非常昂贵的操作。

我建议使用.ToString()然后Regex.Replace使用已编译的正则表达式,并将标志设置为允许多行。

你可能想要一个搜索模式:

(\n[\w-\n]*\n)

然后用空字符串替换它。

查看Expresso以获得出色的.NET正则表达式工具。