在(可能)非常大的文本中查找模式的最佳方法是什么。
我可以使用Regex,但它接受一个字符串作为参数。有没有办法将它与TextReader或某种流一起使用?
答案 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()
调用构建搜索字符串,直到找到非换行符。然后处理并继续在流中继续。