【问题标题】:Which is preferred: Regex.Replace() or. aRegexObject.Replace()?哪个是首选:Regex.Replace() 或。 aRegexObject.Replace()?
【发布时间】:2010-10-03 00:08:29
【问题描述】:

这是this question的后续行动

前两个答案既正确又完整,最终得出完全相同的结果。但是,一个使用 Regex 对象并调用 aRegex.Replace(...) 方法(乔尔的回答),另一个使用静态 Regex.Replace(...) 方法。 (CMS 的回答)。

首选哪种方法?
在什么情况下你会改变主意?

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    使用静态实例每次都会创建一个新的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 对象无法再次使用。

    【讨论】:

    • 反光板真的很清楚。仅将静态用于真正的一次性。
    【解决方案2】:

    它并不像看起来那么低效。使用反射器进入 Regex 构造函数,它会缓存已编译的 regex 代码。这可能是最耗时的部分。

    最初我一般会使用 Regex.Replace(),因为它更方便,并且只有在出现性能问题时才更改。

    您也可以为方便起见在字符串上编写扩展方法,例如:

    public static string RegexReplace(this string source, string pattern, string replacement)
    {
        return Regex.Replace(source, pattern, replacement);
    }
    

    【讨论】:

    • 反射器显示静态方法无论如何都构造了一个 Regex 对象。使用静态比构造自己的对象似乎没有性能优势。它只是作为一次性的简写似乎很有用。
    【解决方案3】:

    使用正则表达式对象意味着正则表达式只编译一次,因此您可以获得更好的性能(您需要将正则表达式对象保存在某个地方)。

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 2010-12-09
      • 2013-07-16
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 2011-03-30
      相关资源
      最近更新 更多