[英]Multi-line regex search in whole file
我发现大量示例可以使用正则表达式替换文件中的文本。 但是,这全部归结为两个版本:
1.遍历文件中的所有行,并将regex应用于每一行
2.加载整个文件。
No. 2使用“我的”文件不可行-它们大约是2GiB ...
关于No. 1:目前这是我的方法,但是我在想...如果需要应用跨越多行的正则表达式怎么办?
答案是:
没有简单的方法
我找到了一个StreamRegex-Class ,它可以执行我想要的操作。
据我所掌握的算法:
这样就不必加载完整文件了-或至少减少了将完整文件加载到内存中的机会...
但是:最坏的情况是整个文件不匹配-在这种情况下,整个文件将被加载到内存中。
正则表达式不是行之有效的方法,尤其是对于大量文本而言尤其如此。 创建一个自己的小解析器:
这将为您提供注释块的所有开始和结束偏移量。 现在,您应该可以通过创建一个临时文件并将文本从原始文件写入临时文件(如果您当然在注释块中,还可以编写其他内容)来替换它们。
编辑:2GiB的源文件?
也许您可以一次加载2行(或更多,具体取决于您认为要跨越的行数),然后重叠它们,例如:先加载1-2行,然后再循环加载2-3行,下次加载3-4; 并在每个循环中对合并的两行进行多行正则表达式。
我要说的是,在进行替换之前,您应该预先解析/规范化数据,以便每一行都描述一组可能需要应用替换的数据。 否则,您将陷入数据完整性方面的复杂问题,而如果没有其他许多困难,这些问题是无法真正解决的。
如果可以将数据分块为逻辑块,则可以构建一个使用mapreduce模式分析数据的程序。
如果您不介意手有点脏(并且正则表达式很简单,或者您对速度有强烈的渴望并且不介意受苦),可以使用Ragel 。 它可以针对C#,尽管该网站未提及。 您需要包装FileStream来提供缓冲的索引器,或者在64位进程中使用内存映射文件(带有不安全的指针)将其用于大型文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.