У меня есть регулярное выражение, которое анализирует (очень небольшое) подмножество языка шаблонов Razor. Недавно я добавил еще несколько правил в регулярное выражение, которые значительно замедлили его выполнение. Мне интересно: существуют ли определенные регулярные выражения, которые, как известно, медленны? Существует ли реструктуризация шаблона, который я использую, чтобы поддерживать читаемость и, тем не менее, повысить производительность? Примечание. Я подтвердил, что это повышение производительности происходит после компиляции.Как повысить производительность регулярного выражения .NET?
Вот картина:
new Regex(
@" (?<escape> \@\@)"
+ @"| (?<comment> \@\* (([^\*]\@) | (\*[^\@]) | .)* \*\@)"
+ @"| (?<using> \@using \s+ (?<namespace> [\w\.]+) (\s*;)?)"
// captures expressions of the form "foreach (var [var] in [expression]) { <text>"
/* ---> */ + @"| (?<foreach> \@foreach \s* \(\s* var \s+ (?<var> \w+) \s+ in \s+ (?<expressionValue> [\w\.]+) \s* \) \s* \{ \s* <text>)"
// captures expressions of the form "if ([expression]) { <text>"
/* ---> */ + @"| (?<if> \@if \s* \(\s* (?<expressionValue> [\w\.]+) \s* \) \s* \{ \s* <text>)"
// captures the close of a razor text block
+ @"| (?<endBlock> </text> \s* \})"
// an expression of the form @([(int)] a.b.c)
+ @"| (?<parenAtExpression> \@\(\s* (?<castToInt> \(int\)\s*)? (?<expressionValue> [\w\.]+) \s* \))"
+ @"| (?<atExpression> \@ (?<expressionValue> [\w\.]+))"
/* ---> */ + @"| (?<literal> ([^\@<]+|[^\@]))",
RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline | RegexOptions.ExplicitCapture | RegexOptions.Compiled);
/* ---> */указывает на новые "правила", которые вызвали замедление.
Ознакомьтесь с рекомендациями для использования с использованием регулярных выражений: http://msdn.microsoft.com/en-us/library/gg578045.aspx –
Я не вижу ничего, что было бы особенно медленным в ваших добавленных выражениях (даже если все обратное отслеживание может быть). Вы уверены, что это соответствие медленное, а не то, что вы делаете с матчем? Можете ли вы сузить его до меньшего выражения? Насколько медленнее совпадение? – Qtax
Зачем вы используете регулярное выражение, а не непосредственно парсер для бритвы, включенный в .net? – Hylaean