我正在尝试从文件中删除以相同单词开头的行。我非常确定正则表达式是正确的,我很确定它不起作用。我想也许它不会这样工作所以我尝试用无空字符串替换。但它不起作用。有任何建议如何解决这个或如何以其他方式做同样的事情?
string pattern = @"^smth";
Regex rgx = new Regex(pattern);
File.WriteAllText(path, rgx.Replace(File.ReadAllText(path), ""));
答案 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), ""));
但是,如果你有大文件,我宁愿使用非正则表达式解决方案。