我可能错误地命名了这个,但我有一个文件,其中包含多行结构:
#### 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));
}
只需将文件名添加到文件末尾即可。我哪里错了?我觉得这样的新手问这个问题。
答案 0 :(得分:1)
正则表达式可能不是理想的解决方案,但如果您的数据结构清晰,那么它将起作用
####\sID:\s(1)\s.*?####\sENDCARD\s####
上查看
只需将(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 ####))"
这只会在中间排除####内容之间的数据。