我找到了大量使用正则表达式替换文件中文本的示例。然而,这一切都归结为两个版本:
1. 遍历文件中的所有行并将正则表达式应用于每一行
2. 加载整个文件。
No. 2 使用“我的”文件是不可行的——它们大约是 2GiB...
至于 No. 1:目前这是我的方法,但是我想知道...如果需要应用跨越多个的正则表达式怎么办线 ?
我找到了大量使用正则表达式替换文件中文本的示例。然而,这一切都归结为两个版本:
1. 遍历文件中的所有行并将正则表达式应用于每一行
2. 加载整个文件。
No. 2 使用“我的”文件是不可行的——它们大约是 2GiB...
至于 No. 1:目前这是我的方法,但是我想知道...如果需要应用跨越多个的正则表达式怎么办线 ?
答案
是:没有简单的方法
我找到了一个StreamRegex-Class可以做我正在寻找的东西。
从我能掌握的算法来看:
这样就不需要加载完整文件了——或者至少减少了将完整文件加载到内存中的机会......
但是:最坏的情况是整个文件中没有匹配项——在这种情况下是完整的文件将被加载到内存中。
正则表达式不是要走的路,尤其是对于这些大量文本。创建一个自己的小解析器:
这将为您提供注释块的所有起始偏移量和结束偏移量。您现在应该能够通过创建一个临时文件并将原始文件中的文本写入临时文件来替换它们(当然,如果您在注释块内,还可以编写其他内容)。
编辑:2GiB 的源文件??
也许您可以一次加载 2 行(或更多,取决于您认为匹配将跨越多少行),并将它们重叠,例如:加载第 1-2 行,然后下一个循环加载第 2-3 行,下一次加载3-4;并在每个循环中对两行合并执行多行正则表达式。
我会说您应该在进行替换之前对数据进行预解析/规范化,以便每一行都描述需要应用替换的一组可能的数据。否则,您会遇到数据完整性问题,如果没有其他许多困难,这些问题就无法真正解决。
如果有办法将数据分块成逻辑块,那么您可以构建一个使用 mapreduce 模式来解析数据的程序。
我和巴特在一起;你真的应该为此使用某种解析器。
或者,如果您不介意生成子进程,则可以使用sed(在 windows 上有一个本机端口,或者您可以使用Cygwin)
如果您不介意弄脏手(并且您的正则表达式足够简单,或者您对速度有强烈的渴望并且不介意受苦),您可以使用Ragel。它可以针对 C#,尽管该站点没有提及它。您需要包装 FileStream 以提供缓冲索引器或在 64 位进程中使用内存映射文件(带有不安全指针)来处理大文件。