删除正则表达式替换行

时间:2015-06-24 09:04:18

标签: c# regex

我正在尝试从文件中删除以相同单词开头的行。我非常确定正则表达式是正确的,我很确定它不起作用。我想也许它不会这样工作所以我尝试用无空字符串替换。但它不起作用。有任何建议如何解决这个或如何以其他方式做同样的事情?

string pattern = @"^smth";
 Regex rgx = new Regex(pattern);
 File.WriteAllText(path, rgx.Replace(File.ReadAllText(path), ""));

1 个答案:

答案 0 :(得分:4)

你不需要正则表达式,我认为你只需要逐行读取文件,并检查每一行是否以smth开头。要启用写入同一位置,只需创建文件的临时副本,然后将其删除即可。

var tmpfile = Path.GetTempPath() + ".mytmpfile.txt";
File.Copy(path, tmpfile, true);
using (var sw = new StreamWriter(path, false, Encoding.UTF8))
{
    using (var sr = new StreamReader(tmpfile, true))
    {
         var line = string.Empty;
         while ((line = sr.ReadLine()) != null)
         {
             if (!line.Trim().StartsWith("smth"))
                sw.WriteLine(line);
         }
    }
    File.Delete(tmpfile);
}

您的正则表达式并不错,但如果您需要将整个文件读入变量,然后使用正则表达式处理多行文本,则需要使用多行模式:string pattern = @"(?m)^smth";(?m)会强制^匹配的开头,而不是整个字符串的结尾。或者使用RegexOptions.Multiline标记Regex.Replace

更新:

您的方法有效,但正则表达式应该看起来像(?m)^\s*smth\b.*(?:\r?\n|\z)

string pattern = @"(?m)^\s*smth\b.*(?:\r?\n|\z)";
Regex rgx = new Regex(pattern);
File.WriteAllText(path, rgx.Replace(File.ReadAllText(path), ""));

但是,如果你有大文件,我宁愿使用非正则表达式解决方案。