c# - 在 StringBuilder 上替换 Regex 的最佳方法是什么?

标签 c# regex stringbuilder

<分区>

Possible Duplicate:
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(...));

我认为它破坏了整个内存保护目的的 20 次。

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

谢谢!

最佳答案

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

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

关于c# - 在 StringBuilder 上替换 Regex 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6791557/

相关文章:

c# - Windows asp .net 应用程序和 Redis

c# - 创建一个可序列化的类 - 复杂对象

python - 正则表达式命名组以开头但不以结尾

regex - 如何使用 Perl 将以下字符串中的逗号替换为 & ?

c# - NSNetService 使用 C# 分配 IP 地址

c# - 如何从Fruit ID中选择Fruit对象(唯一)

java - 如何在正则表达式匹配中排除 "<"

java - 使用 Stringbuilder 创建 long[] 数组

java - 如何使用 StringBuilder 重建字符串?

java - StringBuffer 还是同步方法?