代码之家  ›  专栏  ›  技术社区  ›  Nils

整文件多行regex搜索

  •  8
  • Nils  · 技术社区  · 16 年前

    我已经找到了很多用regex替换文件中文本的示例。然而,这一切归结为两个版本:
    1。迭代文件中的所有行,并对每一行应用regex
    2。加载整个文件。

    2号文件使用“我的”文件是不可行的-它们大约是2Gib…
    关于第一:目前这是我的方法,但是我想知道…如果需要应用跨越多行的regex怎么办?

    6 回复  |  直到 16 年前
        1
  •  2
  •   Nils    16 年前

    答案如下:
    没有简单的方法

    我找到了一个 StreamRegex-Class 可以做我想要的。
    根据我对算法的理解:

    • 从文件开头开始,缓冲区为空
    • 做(
      • 将文件块添加到缓冲区
      • 如果缓冲区中有匹配项
        • 在比赛中得分
        • 从缓冲区中删除匹配结束前出现的所有数据
    • )文件还剩下一些东西

    这样就不需要加载完整的文件——或者至少减少了在内存中加载完整文件的机会……
    但是:最坏的情况是整个文件中没有匹配项——在这种情况下,整个文件将被加载到内存中。

        2
  •  1
  •   Bart Kiers    16 年前

    regex不是一个好方法,尤其是对于这些大量的文本来说。 创建一个自己的小解析器:

    • 逐行读取文件;
    • 每条线:
      • 逐字符循环遍历行,跟踪 打开/关闭字符串文本
      • 当您遇到“/*”(并且您不是“在”字符串中)时, 存储偏移量并循环,直到遇到 先输入“*/”,然后存储该号码

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

    编辑:2Gib的源文件??

        3
  •  0
  •   Mark Bell    16 年前

    也许您可以一次加载两行(或者更多行,取决于您认为匹配将跨越多少行),并将它们重叠,例如:加载行1-2,然后下一个循环加载行2-3,下一个加载行3-4;并在每个循环中对这两行合并多行regex。

        4
  •  0
  •   Harv    16 年前

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

    如果有方法将数据分块到逻辑块中,那么可以构建一个使用MapReduce模式分析数据的程序。

        5
  •  0
  •   Community Mohan Dere    8 年前

    我和巴特在一起;你真的应该使用某种类型的解析器。

    或者,如果您不介意生成子进程,您可以使用 sed (有一个 native port on windows ,或者您可以使用 Cygwin )

        6
  •  0
  •   Nathan Howell    16 年前

    如果你不介意把你的手弄脏一点(而且你的regex足够简单,或者你对速度有强烈的欲望,也不介意有点痛苦),你可以使用 Ragel . 它可以针对C,尽管网站没有提到它。但是,您需要包装一个文件流来提供缓冲索引器,或者在64位进程中使用内存映射文件(带有不安全的指针),以将其用于大型文件。

    推荐文章