【问题标题】:Which class should I use for making many replacements in a string?我应该使用哪个类在字符串中进行多次替换?
【发布时间】:2011-01-14 00:44:25
【问题描述】:

我必须做很多文本替换。哪个类最适合以高性能的方式进行?是StringBuilder吗?

StringBuilder stringBuilder=new StringBuilder(startString);
stringBuilder.Replace(literala1,literala2);
stringBuilder.Replace(literalb1,literalb2);
stringBuilder.Replace(literalc1,literalc2);
...

或者有没有更好的类来做到这一点?顺便说一句,文字大多是常量。

【问题讨论】:

    标签: .net regex string stringbuilder replace


    【解决方案1】:

    Roberto Farah 的博客详细讨论了这个问题:Comparing RegEx.Replace, String.Replace and StringBuilder.Replace – Which has better performance?

    我将在这里总结这些发现,这让许多 .NET 开发人员感到震惊。事实证明,对于相对简单的字符串替换(在匹配不需要区分大小写的情况下),RegEx.Replace() 的性能最差,而 String.Replace() 胜出最好的。

    还提供了指向 CodeProject 上一篇文章的链接,该文章证实了这些发现:StringBuilder vs String / Fast String Operations with .NET 2.0

    总的来说,我会说规则应该如下:

    • 当您只需要进行少量替换(比如大约 5 次)时,请使用 String.Replace()
    • 当您需要进行大量替换时使用StringBuilder.Replace()
    • 仅在最复杂的场景中保留正则表达式 (RegEx.Replace),在这些场景中,为处理所有必要替换的单个表达式的优雅性付出轻微的性能损失是值得的。
    • 忽略上述所有准则并使用任何使您的代码最易读或最具表现力的方法。过早地优化这样的东西不值得我花时间写这个答案。

    【讨论】:

    • +1 表示你写这个答案所花费的时间,即使它不值得......或者它是如何的 ;)
    【解决方案2】:

    我会选择 RegEx.Replace。这个重载:http://msdn.microsoft.com/en-us/library/cft8645c.aspx

    所有不同的输入都可以在正则表达式中匹配,所有不同的替换字符串都可以放在 MatchEvaluator 中。

    【讨论】:

    • 正则表达式几乎总是最慢的选项。除非这是一个非常复杂的替换,否则我不会使用它们,并且使用正则表达式会使您的代码更清晰、更易于理解。
    • -1 用于推荐 RegEx 作为性能选项... RegEx 很慢!
    【解决方案3】:

    StringBuilder 可能是执行此操作的最佳类,因为它不会在替换期间创建底层字符缓冲区的额外副本。如果您对性能敏感,那么String 可能不好,因为它会在每次调用Replace 时创建字符串的副本,并且使用Regex 可能不如@987654325 的直接搜索和替换@。

    【讨论】:

      【解决方案4】:

      我发现使用this code implementing Aho-Corasick string matching 来查找所有要匹配的字符串,然后只使用 StringBuilder 执行一次替换,这比一次循环使用一组字符串替换要好得多。

      【讨论】:

        猜你喜欢
        • 2020-03-23
        • 2014-08-04
        • 2019-04-19
        • 2017-10-23
        • 2011-07-01
        • 1970-01-01
        • 2011-12-01
        相关资源
        最近更新 更多