在StringBuilder上使用正则表达式替换的最佳方法是什么?

时间:2011-07-22 14:32:21

标签: c# regex stringbuilder

  

可能重复:
  Regex replacements inside a StringBuilder

在StringBuilder上多次进行正则表达式替换的最佳方法是什么?

如果您不介意不是tl;dr人,请进一步了解详情:

嗨,我有一个函数可以对字符串进行大量的字符串操作。很自然地,我正在使用StringBuilder类。现在我陷入了两难境地。

我的功能是这样的:

 ParsedText.Append("some footers here");
 ParsedText.Replace("[b]","<b>"); //format all bold opens
 ParsedText.Replace("[/b]","</b>"); //format all bold closes
 ParsedText.Replace("\n","<br />"); //format newlines

 .... sh!* load of other replaces and manipulations ...

 //Add <a href> to all links
 ParsedText = new StringBuilder(Regex.Replace(ParsedText, "pattern", "replacement"))

现在,我有一个自定义的单词(模式)列表,我想要替换 - 大约20个模式..

我试图用他们各自的图像替换所有笑脸符号;像这样:

:) becomes <img src="smile.png" />
;) becomes <img src="wink.png" />

等...我有大约20个图像/符号要替换,我正在使用这个正则表达式

(?<=^|\s):d(?=$|\s) //positive lookahead and lookback at :d

Bob Vale亲切地提供。

这一切都很棒,除了,我不知道如何用StringBuilder替换正则表达式,我不想像这样创建一个新的StringBuilder:

 ParsedText = new StringBuilder(Regex.Replace(...));
我认为它打破了整个记忆保护目的,已经二十次了。

那么,在StringBuilder上进行正则表达式替换的最佳方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

执行此操作的最简单方法是将现有过滤器重构为可以调用以立即运行所有过滤器的方法。完成后,您可以更改代码,以便在添加新字符串之前每次附加到stringbuilder时开始为较小的字符串调用此方法,而不是等到结束并且必须多次构建大字符串。这很重要,因为它可以帮助您避免遇到大型对象堆的问题,并且在垃圾收集器方面更加友好。

一旦你走得那么远,如果你真的雄心勃勃,你也可以重写,开始使用流而不是字符串构建器。这将允许您将多个过滤器组合到一个定制的,高效的状态机中,该机器应该对性能产生可测量的积极影响。但是最后一步将以代码清晰度和易维护性为代价,所以除非您将此代码视为推动应用程序性能,否则不要这样做。

答案 1 :(得分:2)

请参阅此问题并advice from Jon Skeet

  

您的时间最好和最有效的解决方案是首先尝试最简单的方法:忘记StringBuilder并使用Regex.Replace。