【问题标题】:What is the best way to Regex replace on StringBuilder? [duplicate]在 StringBuilder 上进行正则表达式替换的最佳方法是什么? [复制]
【发布时间】:2011-07-23 00:02:57
【问题描述】:

可能重复:
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 的重点。在连接多个字符串时,它提供O(n) 字符串连接而不是O(n^2)。仅此而已。
  • @Matt Ball,抱歉听起来很愚蠢,O(n) 和 O(n^2) 是什么意思?
  • 它被称为大 O 表示法。在这种情况下,这意味着随着项目的数量(或字符串的长度)变大,附加它们的时间或内存将线性增加而不是指数增加。
  • “如果您不介意成为 tl;dr 的人,请进一步阅读以了解详细信息:”我认为您不明白 tl;dr 的意思。 ಠ_ಠ
  • @Joel,感谢您的解释。

标签: c# regex stringbuilder


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    看到这个问题和advice from Jon Skeet:

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

    【讨论】:

    • 谢谢,这也有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多