Проблемы с производительностью класса Regex внутри цикла - PullRequest
1 голос
/ 26 ноября 2010

У меня есть таблица данных, содержащая два столбца (шаблон и новый порядок) и приблизительно 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 Ответ

4 голосов
/ 26 ноября 2010

Если вы используете статические методы для сопоставления, .NET автоматически кэширует скомпилированные объекты Regex для вас.

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

По умолчанию он кэширует только 15 последних использованных объектов, поэтому вы можете увеличить его, настроив свойство Regex.CacheSize .

...