Regex类在循环中的性能问题

时间:2010-11-26 00:43:34

标签: .net regex performance memory-leaks

我有一个包含两列(pattern和neworder)和cca 100行(都有不同模式)的数据表。

我正在做的是将输入字符串与模式匹配(分组匹配),如果匹配,我想使用Regex.Replace命令重新排列检索到的组。

事情是Regex在循环中使用时不会非常友好。由于我必须将输入字符串与多个模式匹配,并重新排列输出字符串的外观,因此我完成此任务的唯一方法是使用Regex类。但这似乎不是一个合适的解决方案,因为它会显着降低性能。

代码看起来像这样

DataTable dt = this.GetPatterns();
DataRow dr;
System.Collections.IEnumerator ie = dt.Rows.GetEnumerator();
while(ie.MoveNext() && !found)
{
    dr = ((DataRow)ie.Current);
    pattern = dr["pattern"].ToString();
    neworder= dr["neworder"].ToString();

    Regex reg = new Regex(pattern, RegexOptions.IgnoreCase);
    Match match = reg.Match(input_string);

    if (match.Success)
    {
    found = true;
    output = reg.Replace(input_string, neworder);
    }

}

1 个答案:

答案 0 :(得分:4)

如果使用静态方法进行匹配,.NET会自动为您编译Regex对象。

if (Regex.Match(input, pattern, options).Success)
{
  output = Regex.Replace(input, pattern, neworder, options);
}

默认情况下,它仅缓存15个最近使用的对象,因此您可以通过调整Regex.CacheSize属性来增加它。