如何对TextReader使用Regex?

时间:2010-01-28 18:57:55

标签: .net regex

在(可能)非常大的文本中查找模式的最佳方法是什么。

我可以使用Regex,但它接受一个字符串作为参数。有没有办法将它与TextReader或某种流一起使用?

2 个答案:

答案 0 :(得分:3)

不,正则表达式可能需要进行回溯。由于仅向前读取流,因此无论如何都必须将整个流保留在内存中。即使你有一个不会回溯的正则表达式,也不会为此构建引擎。

此外,正则表达式无论如何都不是很快。您应该寻找专为读取流而设计的模式匹配方法。

答案 1 :(得分:3)

由于您的模式相对简单(如编辑中所示),您应该能够使用正则表达式并且只能逐行读取流。这是一个找到单词的例子。 (也许,取决于你如何定义“单词。”:-))

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()调用构建搜索字符串,直到找到非换行符。然后处理并继续在流中继续。