我应该使用哪个类来在字符串中进行多次替换?

时间:2011-01-14 00:44:26

标签: .net regex string stringbuilder replace

我必须做很多文字替换。哪种类最适合以高效的方式进行此类操作?是StringBuilder吗?

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

还是有更好的课程吗?顺便说一句,文字将主要是常数。

4 个答案:

答案 0 :(得分:3)

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

我将在这里总结一下这些发现,这让许多.NET开发人员感到震惊。事实证明,对于相对简单的字符串替换(在匹配不必区分大小写的情况下), RegEx.Replace() 的性能最差且 String.Replace() < / strong>赢得最佳。

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

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

  • 当您只需要做少量替换时(例如5左右),请使用String.Replace()
  • 当您需要执行大量替换时,请使用StringBuilder.Replace()
  • 保留正则表达式(RegEx.Replace)仅适用于最复杂的场景,值得为处理所有必要替换的单个表达式的优雅付出轻微的性能损失。
  • 忽略上述所有指南,并使用使您的代码最具可读性或表现力的任何内容。过早地优化这样的事情并不值得我写这个答案的时间。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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