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