Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#中,如何使用正则表达式扫描非常大的文件,或者是否可以一次为正则表达式提供一个字符?_C#_Regex_Large Files - Fatal编程技术网

在c#中,如何使用正则表达式扫描非常大的文件,或者是否可以一次为正则表达式提供一个字符?

在c#中,如何使用正则表达式扫描非常大的文件,或者是否可以一次为正则表达式提供一个字符?,c#,regex,large-files,C#,Regex,Large Files,我正在构建一个工具来扫描任意大文件中的正则表达式模式 我将同时对多个文件执行此操作,因此我希望避免将整个文件加载到内存中,因为它们可以任意大。因此,我将使用内存映射文件和视图访问器对每个文件进行分块,然后扫描每个分块 我的问题是: 如果匹配的文本重叠在两个块上,如何确保不遗漏任何匹配 如果正则表达式可以一次输入一个字符,然后在找到匹配项时触发事件,那么这可能会有所帮助。我可能仍然需要对允许的匹配大小设置一个最大值,但是使用正则表达式是否可以这样做 如果不允许跨行,则缓冲区只需一行 如果您允许跨行

我正在构建一个工具来扫描任意大文件中的正则表达式模式

我将同时对多个文件执行此操作,因此我希望避免将整个文件加载到内存中,因为它们可以任意大。因此,我将使用内存映射文件和视图访问器对每个文件进行分块,然后扫描每个分块

我的问题是:

  • 如果匹配的文本重叠在两个块上,如何确保不遗漏任何匹配

  • 如果正则表达式可以一次输入一个字符,然后在找到匹配项时触发事件,那么这可能会有所帮助。我可能仍然需要对允许的匹配大小设置一个最大值,但是使用正则表达式是否可以这样做


  • 如果不允许跨行,则缓冲区只需一行

    如果您允许跨行,那么您的缓冲区需要与您允许的最大回望+您允许的最长行一样大


    直接回答您的问题时,您不能“一次只输入一个字符”,因为整个搜索和目标字符串都需要存在才能进行比较。

    添加您迄今为止尝试过的内容可能会有所帮助,例如您的研究。Q很好,请包括您计划使用的正则表达式模式。这可能非常相关。这些是固定正则表达式还是用户提供的?因为正则表达式需要能够任意回溯,所以您必须确保缓冲区足够大,能够包含用户提供的整个匹配(所以任意正则表达式是有问题的,因为您不知道它们可能的最大匹配有多大)。它是一个类似grep的工具,用于扫描一堆日志文件。我认为必须进行一些更简单的通配符搜索,并且正则表达式可能应该局限于面向行的扫描。但是,如果有一些类似于正则表达式的低级库可以处理字节枚举并对匹配项进行回调(只提供开始和结束字节计数),那可能会很有用。@Terry说到点子上了。日志文件通常是面向行的(这不是巧合——原因是您的用例!),正则表达式将尝试过滤行(并从单行中提取信息)。利用这一点。