繁体   English   中英

整个文件中的多行正则表达式搜索

[英]Multi-line regex search in whole file

我发现大量示例可以使用正则表达式替换文件中的文本。 但是,这全部归结为两个版本:
1.遍历文件中的所有行,并将regex应用于每一行
2.加载整个文件。

No. 2使用“我的”文件不可行-它们大约是2GiB ...
关于No. 1:目前这是我的方法,但是我在想...如果需要应用跨越多行的正则表达式怎么办?

答案是:
没有简单的方法

我找到了一个StreamRegex-Class ,它可以执行我想要的操作。
据我所掌握的算法:

  • 从文件的开头开始,缓冲区为空
  • 做(
    • 将文件的一部分添加到缓冲区
    • 如果缓冲区中有匹配项
      • 标记比赛
      • 从缓冲区中删除比赛结束之前出现的所有数据
  • ),而文件仍有剩余

这样就不必加载完整文件了-或至少减少了将完整文件加载到内存中的机会...
但是:最坏的情况是整个文件不匹配-在这种情况下,整个文件将被加载到内存中。

正则表达式不是行之有效的方法,尤其是对于大量文本而言尤其如此。 创建一个自己的小解析器:

  • 逐行读取文件;
  • 每行:
    • 通过char循环遍历char,跟踪所有打开/关闭字符串文字
    • 当遇到“ / *”(而不是在字符串“内部”)时,存储该偏移号并循环,直到遇到第一个“ * /”并存储该号

这将为您提供注释块的所有开始和结束偏移量。 现在,您应该可以通过创建一个临时文件并将文本从原始文件写入临时文件(如果您当然在注释块中,还可以编写其他内容)来替换它们。

编辑:2GiB的源文件?

也许您可以一次加载2行(或更多,具体取决于您认为要跨越的行数),然后重叠它们,例如:先加载1-2行,然后再循环加载2-3行,下次加载3-4; 并在每个循环中对合并的两行进行多行正则表达式。

我要说的是,在进行替换之前,您应该预先解析/规范化数据,以便每一行都描述一组可能需要应用替换的数据。 否则,您将陷入数据完整性方面的复杂问题,而如果没有其他许多困难,这些问题是无法真正解决的。

如果可以将数据分块为逻辑块,则可以构建一个使用mapreduce模式分析数据的程序。

我和巴特在一起 您确实应该为此使用某种解析器。

或者,如果您不介意生成子进程,则可以使用sed在Windows上有一个本机端口 ,或者可以使用Cygwin

如果您不介意手有点脏(并且正则表达式很简单,或者您对速度有强烈的渴望并且不介意受苦),可以使用Ragel 它可以针对C#,尽管该网站未提及。 您需要包装FileStream来提供缓冲的索引器,或者在64位进程中使用内存映射文件(带有不安全的指针)将其用于大型文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM