Regex.Replace和String immutability

时间:2011-04-19 18:09:19

标签: c# .net regex

说我有一个Compiled Regex对象:

    public static Regex myRgx = new Regex(@"[\d]+",RegexOptions.Compiled); 

现在让我说我正在读取字符串变量SS中的大字符串,然后我使用我的Regex对象替换该字符串中的所有匹配

    myRgx.Replace(SS,"($&)");

问题:.Replace内部是否使用StringBuilder来完成工作,就像在String.ReplaceAll()中发生的那样? 如果没有办法解决这个问题? 更新:
我不知道是否可以将另一个问题作为对原始问题的更新。如果不合适,可以随意编辑它。
问题2:如果我需要预先形成一系列替换,使用多个Regex对象,如下所示:

string input = "Some LARGE string";
input = rgx1.Replace(input,"substitution1");
input = rgx2.Replace(input,"substitution2");  
input = rgx3.Replace(input,"substitution3");  

我正在编写一个形态分析器,所以正则表达式对象需要保持独立,并且需要按照上面的代码中的某个顺序进行替换。正则表达式对象的数量很大,我们正在说千兆字节的文本,所以每次正则表达式对象替换时,传递一个新的字符串对象,这里真的不是一个选项。
有什么建议吗?

6 个答案:

答案 0 :(得分:2)

Regex.Replace()不会更改您的字符串SS。它返回一个全新的字符串,替换了东西。

答案 1 :(得分:2)

是的,Regex.Replace方法使用StringBuilder,通过Reflector发现。

答案 2 :(得分:2)

Replace不会修改您的字符串,但会创建一个包含所请求修改的新字符串。其他一切都是一个实现细节,你不应该在意。如果您不信任正则表达式库,请不要使用它。即使它现在按照您的意愿行事,但未来可能会发生变化而不另行通知。

答案 3 :(得分:2)

找到一篇讨论various replace methods详细信息的好帖子。性能似乎因使用情况而异。对于简单的替换,Regex速度较慢但使用的内存更少,并且创建的对象需要更少的垃圾回收。

答案 4 :(得分:1)

请放心,正则表达式库在这里做正确的事情。 在内部使用StringBuilder或等效内容将没有任何合理的权衡。

因此,Regex.Replace肯定会在这里使用渐近有效的方法。

答案 5 :(得分:0)

是。 Regex内部使用StringBuilder,因此已优化