Loc*_*rde 6 c# regex 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"))
Run Code Online (Sandbox Code Playgroud)
现在,我有一个自定义的单词(模式)列表,我想要替换 - 大约20个模式..
我试图用他们各自的图像替换所有的笑脸符号; 像这样:
:) becomes <img src="smile.png" />
;) becomes <img src="wink.png" />
Run Code Online (Sandbox Code Playgroud)
等等...我有大约20个图像/符号要替换,我正在使用这个正则表达式
(?<=^|\s):d(?=$|\s) //positive lookahead and lookback at :d
Run Code Online (Sandbox Code Playgroud)
其中鲍勃谷友好提供.
所有这一切都很棒,除了,我不知道如何用StringBuilder替换正则表达式,我不想像这样创建一个新的StringBuilder:
ParsedText = new StringBuilder(Regex.Replace(...));
Run Code Online (Sandbox Code Playgroud)
我认为它击败了整个记忆保护目的二十次.
那么,在StringBuilder上进行正则表达式替换的最佳方法是什么?
谢谢!
最简单的方法是将现有过滤器重构为可以调用以立即运行所有过滤器的方法。完成此操作后,您可以更改代码,以便每次在添加新字符串之前附加到字符串构建器时开始为较小的字符串调用此方法,而不是等到最后才多次构建大字符串。这很重要,因为它可以让您避免遇到大对象堆的问题,并且对垃圾收集器更加友好。
一旦你做到了这一点,如果你真的雄心勃勃,你也可以重写以开始使用流而不是字符串构建器。这将允许您将多个过滤器组合成一个定制的、高效的状态机,这应该对性能产生可衡量的积极影响。但这最后一步将以代码清晰度和易于维护为代价,因此除非您认为此代码可以提高应用程序的性能,否则不要这样做。