删除多行文本C#

时间:2012-01-06 00:18:25

标签: c# regex

我可能错误地命名了这个,但我有一个文件,其中包含多行结构:

#### ID: 0 NAME: card_inventory ####
{ ALL CONTENT WOULD GO BETWEEN HERE }
#### ENDCARD ####

#### ID: 1 NAME: card_inventory ####
{ ALL CONTENT WOULD GO BETWEEN HERE }
{ I WANT TO REMOVE ALL REFERENCES TO
  THIS CARD WITH AN ID OF 1 }
#### ENDCARD ####

所以基本上我的问题是如何找到卡片ID并删除它的内容?我在想RegEX,但我不确定,因为我以前从未尝试过这种事。

==== UPDATE ====
所以我有点工作,但是当我调用我的删除操作时,我遇到了一个新问题

using (StreamWriter sw = File.AppendText(this.cardinfo_path))
{
    sw.WriteLine(Regex.Replace(this.cardinfo_path,
        @"####\sID:\s(" + id + @")\s.*?####\sENDCARD\s####", "TACO",
        RegexOptions.Singleline));
}

只需将文件名添加到文件末尾即可。我哪里错了?我觉得这样的新手问这个问题。

4 个答案:

答案 0 :(得分:1)

正则表达式可能不是理想的解决方案,但如果您的数据结构清晰,那么它将起作用

####\sID:\s(1)\s.*?####\sENDCARD\s####

http://refiddle.com/1n0

上查看

只需将(1)替换为您要删除的ID。

Regex.Replace( filecontents, 
               @"####\sID:\s(" + cardid + @")\s.*?####\sENDCARD\s####",
               "",
               RegexOptions.Singeline );

此正则表达式的关键是使用non-greedy .*?匹配,以便它匹配ID后第一次出现的ENDCARD。

答案 1 :(得分:0)

我会在读取文件的一个循环中执行此操作,在检测到“#### ID:1”时触发布尔标志(并在下次检测到“####”时重置),另一个流写入如果布尔标志为真,则为输出文件。

代码看起来很像(手写):

var reader = new FileReader ("input.cards");
var writer = new FileWriter ("filtered.cards");

var writeToOutput = true;

while (! reader.EndOfStream)
{
    var inputLine = reader.ReadLine ();

    if (inputLine.StartsWith ("####"))
    {
        // control line
        if (inputLine.Contains ("ID: 1"))
            writeToOutput = false;

        if (! writeToOutput && inputLine.Contains ("ENDCARD"))
            writeToOutput = true;
    }

    if (writeToOutput)
        writer.WriteLine (inputLine);
}

答案 2 :(得分:0)

可以使用单个正则表达式完成,但是一个小过滤器也应该这样做(如果你想要做更多的事情,也会给你更多的灵活性):

bool skipCurrentCart = false;

var cartFileName = "yourcartfile";
var tmpFileName = Path.GetTempFileName();

using (var reader = new StreamReader(cartFileName))
using (var writer = new StreamWriter(tmpFileName))
{
    while (!reader.EndOfStream)
    {
         var line = reader.ReadLine();

         if (!skipCurrentCart)
         {
             writer.WriteLine(line);
         }

         if (line.StartsWith(string.Format("#### ID: {0} NAME: card_inventory ####", cartIdToIgnore)))
         {
             skipCurrentCart = true;
         }
         else if (line.StartsWith("#### ENDCARD ####"))
         {
             skipCurrentCart = false;
         }
    }
}

// replace cart file
File.Move(tmpFileName, cartFileName);

答案 3 :(得分:0)

我对你的问题感到困惑。你似乎想要不同的东西。您要删除卡还是仅删除其内容。以下内容仅删除其内容。

(?<=(#### ID: 1 NAME: card_inventory ####))(.|\n)+?(?=(#### ENDCARD ####))

只需将卡ID更改为您需要的任何内容。

也许:

"(?<=(#### ID: " + cardId + " NAME: card_inventory ####))(.|\n)+?(?=(#### ENDCARD ####))"

这只会在中间排除####内容之间的数据。