Вам не нужно регулярное выражение для этого, я думаю, вам просто нужно прочитать файл в построчно, и проверить, если каждая строка начинается с 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
.
UPDATE:
Вашего подход справедлив, но регулярное выражение должно выглядеть (?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), ""));
Однако, если у вас есть большие файлы, я предпочел бы пойти с не-регулярным выражением решением.
Это тоже будет что-то с вашим регулярным выражением. Вы попробовали примеры здесь: https://msdn.microsoft.com/en-us/library/xwewhkd1(v=vs.110).aspx – LzyPanda