【发布时间】:2010-10-03 00:08:29
【问题描述】:
这是this question的后续行动
前两个答案既正确又完整,最终得出完全相同的结果。但是,一个使用 Regex 对象并调用 aRegex.Replace(...) 方法(乔尔的回答),另一个使用静态 Regex.Replace(...) 方法。 (CMS 的回答)。
首选哪种方法?
在什么情况下你会改变主意?
【问题讨论】:
这是this question的后续行动
前两个答案既正确又完整,最终得出完全相同的结果。但是,一个使用 Regex 对象并调用 aRegex.Replace(...) 方法(乔尔的回答),另一个使用静态 Regex.Replace(...) 方法。 (CMS 的回答)。
首选哪种方法?
在什么情况下你会改变主意?
【问题讨论】:
使用静态实例每次都会创建一个新的Regex对象,所以最好自己实例化。这是我在 System.dll 上使用 Reflector 时发现的:
public static string Replace(string input, string pattern, string replacement)
{
return new Regex(pattern, RegexOptions.None, true).Replace(input, replacement);
}
另外,如果您实例化自己的实例,您也可以编译它并提高多种用途的性能。
您可以将RegexOptions.Compiled 发送到静态Replace 重载之一,但这毫无意义,因为将使用此标志实例化的Regex 对象无法再次使用。
【讨论】:
它并不像看起来那么低效。使用反射器进入 Regex 构造函数,它会缓存已编译的 regex 代码。这可能是最耗时的部分。
最初我一般会使用 Regex.Replace(),因为它更方便,并且只有在出现性能问题时才更改。
您也可以为方便起见在字符串上编写扩展方法,例如:
public static string RegexReplace(this string source, string pattern, string replacement)
{
return Regex.Replace(source, pattern, replacement);
}
【讨论】:
使用正则表达式对象意味着正则表达式只编译一次,因此您可以获得更好的性能(您需要将正则表达式对象保存在某个地方)。
【讨论】: