Как я могу использовать Regex против TextReader? - PullRequest
4 голосов
/ 28 января 2010

Как лучше всего искать шаблон в (потенциально) очень большом тексте.

Я мог бы использовать Regex, но он принимает строку в качестве аргумента. Есть ли способ использовать его с TextReader или каким-то другим потоком вместо этого?

Ответы [ 2 ]

3 голосов
/ 28 января 2010

Поскольку ваши шаблоны относительно просты (как указано при редактировании), вы должны иметь возможность использовать регулярные выражения и просто читать поток построчно. Вот пример, который находит слова. (Может быть, в зависимости от того, как вы определяете «слова» :-))

var pattern = new Regex(@"\b\w+\b");

using (var reader = new StreamReader(@"..\..\TextFile1.txt"))
{
    while (reader.Peek() >= 0)
    {
        Match match = pattern.Match(reader.ReadLine());
        while (match.Success)
        {
            Console.WriteLine(match.Value);
            match = match.NextMatch();
        }
    }
}

Если вы ищете что-то, что связано с переводом строк, вам нужно быть немного креативным. Добавьте их в строку поиска. Или, если многократные переводы строк значимы, создайте строку поиска в памяти с несколькими вызовами ReadLine(), пока не будет найден не перевод строки. Затем обработайте это и двигайтесь дальше в потоке.

3 голосов
/ 28 января 2010

Нет, регулярному выражению может потребоваться откат назад. Поскольку поток только читается вперед, это будет означать, что ему все равно придется хранить весь поток в памяти. Даже если у вас есть регулярное выражение, которое не возвращается, движок для этого не создан.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...