由于正则表达式似乎只接受字符串,因此搜索文件的最常用方法是将其读取为单个字符串或依次读取每一行。 问题是,对于大文件,您要么在内存中保存一个巨大的字符串,要么使用大量创建,使用并留给垃圾收集的字符串来终止GC。 有没有人知道更好的方法来解决这个问题?
答案 0 :(得分:5)
“最佳”方式取决于您的需求。
你不会很快用大量的字符串“杀死”GC。测试/验证您的假设。
如果您的问题是基于行的,请逐行阅读。优先File.ReadLines()
优先于File.ReadAllLines()
。
如果您的问题跨越整个文件(RegexOptions.Multiline
,可能包含模式中的换行符),则必须将其读入1个字符串。如果成为问题,请使用较小的文件。
在所有情况下,使用常识和/或分析器。
答案 1 :(得分:1)
如果你需要处理一个不适合内存的完整文件(如几KB的数据),你可能应该研究“正确”的解析。周围有许多好parser generator tools,我最喜欢的是Devin Cook的GOLD Parsing System,但ANTLR之类的其他人也很好。
正则表达式引擎不是普通的DFA,它在某些情况下会回溯。我认为这就是为什么正则表达式不能应用于一系列字符的原因;因为需要有效的随机访问将数据保存在内存中似乎是一个明显的解决方案。
答案 2 :(得分:0)
逐行加载,或加载文件的部分。如果您希望Regex跨越换行符,请使用多行选项