2011-04-19 48 views
1

说我有一个正则表达式编译对象:Regex.Replace和字符串不变性

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

现在让我们说我读大串入字符串变量SS,然后我用我的正则表达式对象,以取代所有比赛该字符串中

 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"); 

我正在写一个形态分析,所以regex对象必须保持独立,而需要按照上面的代码以某种顺序进行替换。正则表达式对象的数量很大,我们正在谈论千兆字节的文本,所以每当一个正则表达式对象被替换时传递一个新的字符串对象,在这里不是一个真正的选择。
有何建议?

+2

它必须是一个相当枯燥的大字符串,担心良好使用的框架函数的内部性能影响。 – Reddog 2011-04-19 18:13:56

回答

2

是的,Regex.Replace方法使用StringBuilder,如通过反射器发现的。

1

请放心,正则表达式库在这里做正确的事情。 不是使用StringBuilder或内部等价物不会有任何合理的权衡。

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

2

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

0

是的。 Regex内部使用StringBuilder所以它是优化

2

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

2

找到一个好帖子,讨论various replace methods的细节。性能似乎因使用情况而异。对于简单替换正则表达式速度较慢,但​​使用的内存少得多,创建的对象数量少,需要垃圾回收。

相关问题