2015-06-24 4 views
4

Я пытаюсь удалить строки из файла, начинающиеся с того же слова. Я почти уверен, что регулярное выражение верное, и я уверен, что он не работает. Я думал, что, возможно, это не работает так, поэтому я попытался заменить пустой пустой. Но это не работает. Любые предложения, как исправить это или как сделать то же самое другим способом?Удаление строк с помощью регулярного выражения

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

Это тоже будет что-то с вашим регулярным выражением. Вы попробовали примеры здесь: https://msdn.microsoft.com/en-us/library/xwewhkd1(v=vs.110).aspx – LzyPanda

ответ

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.

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), "")); 

Однако, если у вас есть большие файлы, я предпочел бы пойти с не-регулярным выражением решением.

+1

Почему именно мне нужен временный файл? Не могу ли я внести изменения в исходный файл? Кроме того, что такое WriteLine? Я не хочу удалить всю строку, начинающуюся со слова, а не писать. –

+1

@DDavid: вы можете избавиться от файла temp, просто прочитав содержимое файла в переменной и после того, как файл будет выпущен, напишите ему. Я просто не знаю, насколько велик ваш файл. Обычно мне приходится обрабатывать> 1 ГБ файлы :( –

+0

На самом деле еще один вопрос: может ли проблема с регулярным выражением заключаться в том, что строка начинается с пробелов? Это файл 87 КБ: D –