Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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_Algorithm_Optimization - Fatal编程技术网

C# 什么';在文本文件中使用正则表达式的最佳方式是什么?

C# 什么';在文本文件中使用正则表达式的最佳方式是什么?,c#,regex,algorithm,optimization,C#,Regex,Algorithm,Optimization,由于正则表达式似乎只接受字符串,所以搜索文件最常用的方法是将其读入单个字符串或依次读入每一行。 问题是,对于大文件,要么在内存中保存一个巨大的字符串,要么用创建、使用并留给垃圾收集的大量字符串杀死GC。 有谁知道更好的方法来解决这个问题吗?如果您需要处理一个不适合内存的完整文件(如几KB的数据),您可能应该研究“正确的”解析。周围有很多好东西,我最喜欢的是Devin Cook的,但其他的也很不错 正则表达式引擎不是一个普通的DFA,它在某些情况下会回溯。我假设这就是正则表达式不能应用于字符序列的

由于正则表达式似乎只接受字符串,所以搜索文件最常用的方法是将其读入单个字符串或依次读入每一行。 问题是,对于大文件,要么在内存中保存一个巨大的字符串,要么用创建、使用并留给垃圾收集的大量字符串杀死GC。
有谁知道更好的方法来解决这个问题吗?

如果您需要处理一个不适合内存的完整文件(如几KB的数据),您可能应该研究“正确的”解析。周围有很多好东西,我最喜欢的是Devin Cook的,但其他的也很不错


正则表达式引擎不是一个普通的DFA,它在某些情况下会回溯。我假设这就是正则表达式不能应用于字符序列的原因;由于需要有效的随机访问,将数据保存在内存中似乎是显而易见的解决方案。

如果您需要处理不适合内存的完整文件(如几KB的数据),您可能应该研究“适当的”解析。周围有很多好东西,我最喜欢的是Devin Cook的,但其他的也很不错


正则表达式引擎不是一个普通的DFA,它在某些情况下会回溯。我假设这就是正则表达式不能应用于字符序列的原因;因为需要高效的随机访问,所以将数据保存在内存中似乎是显而易见的解决方案。

最佳方式取决于您的需要

而且你不会用大量的字符串那么快地“杀死”GC。测试/验证你的假设

  • 如果你的问题是基于行的,请逐行阅读。首选
    File.ReadLines()
    而不是
    File.ReadAllLines()

  • 如果问题涉及整个文件(
    RegexOptions.Multiline
    ,可能包括模式中的换行符),则必须将其读入一个字符串。如果出现问题,请使用较小的文件

  • 在所有情况下,使用常识和/或探查器


    • 最佳方式取决于您的需求

      而且你不会用大量的字符串那么快地“杀死”GC。测试/验证你的假设

      • 如果你的问题是基于行的,请逐行阅读。首选
        File.ReadLines()
        而不是
        File.ReadAllLines()

      • 如果问题涉及整个文件(
        RegexOptions.Multiline
        ,可能包括模式中的换行符),则必须将其读入一个字符串。如果出现问题,请使用较小的文件

      • 在所有情况下,使用常识和/或探查器



      可以逐行加载,也可以加载部分文件。如果希望正则表达式跨越换行符,请使用多行选项逐行加载或加载文件的部分。如果您想让正则表达式跨越换行符,请使用多行选项

      +1,也可以使用
      IEnumerable File.ReadLines
      方法逐行读取。该方法尚未添加,因此我写了注释,然而,当我写完评论并发布后,我发现你已经添加了它:)@Henk:我不知道
      多行
      选项有什么关系。它所做的只是改变字符串/线锚(
      ^
      $
      )的行为,而你甚至不知道OP是否在使用它们。@Alan:这就是为什么这个句子以if开头。@Henk:谢谢。事实上,在发布了这个问题之后,我注意到字符串实例的数量并不是一个大问题。但是,从性能角度来看,在开始处理非常大的文件之前,最好将文件作为单个字符串传递。我会接受你的答案——主要是“常识”部分。在我的情况下,我可能要考虑文件的大小,如果有大文件,我会读取它的块,在最坏的情况下错过一些命中(非常低的概率)。对于我的需要,这是可以接受的。+1,对于逐行阅读,他可以使用
      IEnumerable File.ReadLines
      方法。它还没有添加,所以我写了评论,但是在我写完评论并发布后,我发现你已经添加了它:)@Henk:我不知道
      多行
      选项有什么关系。它所做的只是改变字符串/线锚(
      ^
      $
      )的行为,而你甚至不知道OP是否在使用它们。@Alan:这就是为什么这个句子以if开头。@Henk:谢谢。事实上,在发布了这个问题之后,我注意到字符串实例的数量并不是一个大问题。但是,从性能角度来看,在开始处理非常大的文件之前,最好将文件作为单个字符串传递。我会接受你的答案——主要是“常识”部分。在我的情况下,我可能要考虑文件的大小,如果有大文件,我会读取它的块,在最坏的情况下错过一些命中(非常低的概率)。对于我的需要,这是可以接受的。在某些情况下,这是一个很好的建议。OP不是很具体。在某些情况下是很好的建议。这篇文章不是很具体。@Henk:我相信,这里是一个流氓迷因的例子。阿克兰,请阅读下面的评论。@Henk:我相信,这里是流氓迷因的一个例子。阿克兰,请阅读下面的评论。你有没有经历过一次
      杀死GC
      ?你是怎么做到的?太*(现在我必须再键入11个字符…)那么你在GC中遇到了什么问题?或者你只是害怕他们?你有没有经历过杀死GC的
      ?你是怎么做到的?太*(现在我必须再键入11个字符…)那么你在GC中遇到了什么问题?还是你只是害怕他们?