Код ниже содержит регулярное выражение, предназначенное для извлечения строкового литерала C#, но производительность соответствия регулярных выражений для строк ввода более чем нескольких символов является горькой.Slow Regex performance
class Program
{
private static void StringMatch(string s)
{
// regex: quote, zero-or-more-(zero-or-more-non-backslash-quote, optional-backslash-anychar), quote
Match m = Regex.Match(s, "\"(([^\\\\\"]*)(\\\\.)?)*\"");
if (m.Success)
Trace.WriteLine(m.Value);
else
Trace.WriteLine("no match");
}
public static void Main()
{
// this first string is unterminated (so the match fails), but it returns instantly
StringMatch("\"OK");
// this string is terminated (the match succeeds)
StringMatch("\"This is a longer terminated string - it matches and returns instantly\"");
// this string is unterminated (so the match will fail), but it never returns
StringMatch("\"This is another unterminated string and takes FOREVER to match");
}
}
Я могу реорганизовать регулярное выражение в другой форме, но может кто-нибудь дать объяснение, почему производительность настолько плохо?
http://msdn.microsoft.com/en-us/magazine/ff646973.aspx – SLaks
Я думаю, что это неправильно. '[^ \"] 'не останавливается на' \ "'. Он остановится на '\' или на '' '. Таким образом, он остановится на' \ 'из' \ n'. Правильно? – xanatos
Возможно, вы можете изменить свое регулярное выражение, если вы не используете обратные ссылки. '" \ "(?: (?: [^ \\\"] *) (?:. \\?)) * \ "" '. Конечно, если вы используете обратные ссылки, то игнорируйте это. – Matthew