我有一个正则表达式,它解析 Razor 模板语言的一个(非常小的)子集。最近,我在正则表达式中添加了一些规则,这大大减慢了它的执行速度。我想知道:是否有某些已知的正则表达式结构很慢?是否对我正在使用的模式进行了重组以保持可读性并提高性能?注意:我已确认此性能影响发生在编译后。
这是模式:
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);
/* ---> */ 表示导致减速的新“规则”。