2009-02-07 4 views
2

Я пишу программу, которая должна искать текстовый документ LARGE для большой коллекции слов. Слова - это все имена файлов, с символами подчеркивания (например, this_file_name). Я знаю, как открывать и проходить через текстовый документ, но мне любопытно, следует ли использовать Regex для поиска этих имен, и если да, то какой reg. ех. следует использовать последовательность? Я пробовалC# регулярные выражения - соответствующие целые слова?

 
Regex r = new Regex("?this\_file\_name"); 

, но каждый раз я получаю неверную ошибку аргумента.

ответ

3

Было бы полезно увидеть образец исходного текста. но, возможно, это помогает

var doc = @"asdfsdafjkj;lkjsadf asddf jsadf asdfj;lksdajf 
sdafjkl;sjdfaas sadfj;lksadf sadf jsdaf jf sda sdaf asdf sad 
jasfd sdf sadf sadf sdajlk;asdf 
this_file_name asdfsadf asdf asdf asdf 
asdf sadf asdfj asdf sdaf sadfsadf 
sadf asdf this_file_name asdf asdf "; 

var reg = new Regex("this_file_name", RegexOptions.IgnoreCase | RegexOptions.Multiline); 
var matches = reg.Matches(doc); 
+0

Модификатор Multiline не требуется. –

+0

@ Алан М, почему бы и нет? – bendewey

+0

Как указал Алан, 'RegexOptions.Multiline' не требуется. Прочтите его документацию. Это только имеет значение, если вы используете '^' и/или '$'. – Timwi

0

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

Если это так, используйте String.Split, чтобы поместить все имена файлов в массив, отсортировать массив по алфавиту и выполнить двоичный поиск по сортированному массиву для каждого элемента в упомянутой вами «коллекции». Я почти уверен, что это самый эффективный в вычислительном отношении способ выполнения задачи.

Когда вы говорите текстовые файлы «LARGE», подумайте об их размере относительно машин, в которых эта программа будет работать. Текстовый файл размером 1 МБ может показаться большим, но он легко впишется в память машины с 2 ГБ ОЗУ. Если файл значительно больше по сравнению с памятью ваших клиентских машин, прочитайте файл в кусках за раз. Это называется буферизацией.

1

Возможно, сломайте свой документ в токенах, разделив сначала пробелы или символы без слов?

После, я думаю, что регулярное выражение, которое может работать для вас будет выглядеть примерно так:

Regex r = new Regex(@"([\w_]+)");

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