Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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# 在StringBuilder上替换正则表达式的最佳方法是什么?_C#_Regex_Stringbuilder - Fatal编程技术网

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

C# 在StringBuilder上替换正则表达式的最佳方法是什么?,c#,regex,stringbuilder,C#,Regex,Stringbuilder,可能重复: 在StringBuilder上多次替换正则表达式的最佳方法是什么? 如果你不介意做一个tl;dr人员,请进一步阅读以了解详细信息: 嗨,我有一个函数,它对一个字符串进行了大量的字符串操作。所以很自然,我使用StringBuilder类来实现它。现在我进退两难 我的函数是这样的: ParsedText.Append("some footers here"); ParsedText.Replace("[b]","<b>"); //format all bold open

可能重复:

在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"))
我认为它有二十次破坏了保存记忆的目的

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


谢谢

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

一旦你做到了这一点,如果你真的雄心勃勃,你也可以重新编写,开始使用streams而不是stringbuilder。这将允许您将多个过滤器组合到一个定制的、高效的状态机中,该状态机将对性能产生可测量的积极影响。但这最后一步将以代码清晰和易于维护为代价,因此,除非您将此代码视为驱动应用程序性能的因素,否则不要这样做。

请参见此问题并:

目前最好、最有效的解决方案是首先尝试最简单的方法:忘记StringBuilder,只使用Regex.Replace


我认为您没有理解
StringBuilder
的要点。当连接多个字符串时,它提供了
O(n)
字符串连接,而不是
O(n^2)
。“就是这样!”马特·鲍尔,很抱歉听起来很愚蠢,O(n)和O(n^2)是什么意思?它叫大O符号。太长了,读不下去了,因为在这个例子中,当项目的数量(或者字符串的长度)变大时,附加它们的时间或内存将线性增加而不是指数。“如果你不介意成为TL;Dr Dead,请进一步阅读细节:”我不认为你得到了TL;博士的意思是。ಠ_ಠ@乔尔,谢谢你的解释。谢谢,这也有帮助。
:) becomes <img src="smile.png" />
;) becomes <img src="wink.png" />
(?<=^|\s):d(?=$|\s) //positive lookahead and lookback at :d
 ParsedText = new StringBuilder(Regex.Replace(...));