2010-10-04 2 views
1

У меня есть огромный файл, и я хочу сбить все в файле, за исключением того, что соответствует моему регулярному выражению. Я знаю, что могу получить матчи и просто извлечь их, но я хочу сохранить свой файл и избавиться от всего остального.Соответствие всем, кроме указанного регулярного выражения

Вот мое регулярное выражение:

"Id":\d+ 

Как я говорю "Матч всех кроме"Id":\d+". Что-то в строках

!("Id":\d+) (pseudo regex)?

Я хочу использовать его с функцией Regex Replace. По-английски я хочу сказать:

Получить весь текст, который не является "Id":\d+, и заменить его на пустую строку.

+0

Когда вы говорите, что выбрасываете все остальное, вы имеете в виду строки, содержащие регулярное выражение, или просто держите строки, соответствующие регулярному выражению? – Rohith

+1

Вы хотите, чтобы регулярное выражение соответствовало всем, кроме вашего регулярного выражения? –

+1

ваш вопрос звучит как ловушка логического ума. ;-) – splash

ответ

1

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

Yoo писал:

Получить весь текст, который не является "Id": \ d + и заменить его и пустая строка.

Логический эквивалент будет:

Получить весь текст, который соответствует "Id":\d+ и поместить его в новый файл. Замените старый файл на новый.

+1

Micah упоминает в своем вопросе, что он не хочет этого делать – Rohith

+0

Но он сказал: «Я хочу сдуть все в файле, кроме того, что соответствует моему регулярному выражению», поэтому я понимаю это, поскольку он хочет, чтобы все строки, которые соответствовать его регулярному выражению. Я нахожу это немного запутанным. – splash

1

хорошо, противоположность \d в Perl-МОГ регулярных выражений \D. У .net есть что-то подобное?

+0

Да, .NET это поддерживает. –

0

Я не использую .net и раньше, но после работы в Java

System.out.println("abcd Id:12351abcdf".replaceAll(".*(Id:\\d+).*","$1")); 

производит выход

Id:12351 

Хотя в истинном смысле оно не соответствует критериям соответствия все, кроме Id: \ d +, но это делает работу

+0

Попробуйте и посмотрите, что произойдет, когда у вас есть два экземпляра 'Id: 234' в вашей строке ... –

2

Попробуйте это:

string path = @"c:\temp.txt"; // your file here 
string pattern = @".*?(Id:\d+\s?).*?|.+"; 
Regex rx = new Regex(pattern); 

var lines = File.ReadAllLines(path); 
using (var writer = File.CreateText(path)) 
{ 
    foreach (string line in lines) 
    { 
     string result = rx.Replace(line, "$1"); 
     if (result == "") 
      continue; 

     writer.WriteLine(result); 
    } 
} 

Образец сохранит пробелы между несколькими Id: Number Вхождений в одной строке. Если у вас только один Id на линию, вы можете удалить \s? из рисунка. File.CreateText откроет и перезапишет существующий файл. Если замена приводит к пустой строке, она будет пропущена. В противном случае результат будет записан в файл.

Первая часть шаблона соответствует Id: Number Вступления. Он включает в себя чередование для .+ для соответствия строкам, где Id: Номер не отображается.Замена использует $1, чтобы заменить совпадение содержимым первой группы, которая является фактическим номером Id: (Id:\d+\s?).

Смежные вопросы