Статья Details of Regular Expression Behavior из MSDN говорит, что .NET разработчики решили использовать для регулярных выражений традиционных NFA двигателя, потому что это быстрее, чем POSIX NFA, но это мне не ясно, почему эта модель работает экспоненциально медленно, то ?Действительно ли .NET использует NFA для механизма регулярных выражений?
var regex = new Regex("(a|aa)*b");
var b = regex.IsMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac");
Это простое сопоставление с образцом занять более 30 минут, чтобы выполнить. Но если .NET использует традиционный NFA, можно смоделировать его и найти совпадение в O (M * N) время в худшем случае, где M - длина рисунка, а N - длина текста, что, безусловно, неверно в этом дело.
Статья также объясняет, что откат является причиной медленного исполнения, но я до сих пор есть некоторые вопросы, которые не могут найти ответы
- Что возвратов? это только с использованием уже подобранного шаблона, подобного этому
(a|b)c/1
? - Поддерживает ли традиционный NFA поддержки, если нет какой-либо модификации?
- Если NFA поддерживает его, но требуется более медленный алгоритм для моделирования, почему .NET не может проверить, существует ли обратное отслеживание в шаблоне, и использовать один алгоритм и использовать другой, если это не так?
Вы должны сосредоточиться на одном вопросе за раз. Я могу легко объяснить вам, что происходит в этом контексте, но у меня нет ответов на два других вопроса, а это значит, что мне придется либо опубликовать неполный ответ, либо, как я буду делать сейчас, а не публиковать сообщения в все. –
Вопросы очень связаны с Лассе В. Карлсеном, поэтому я решаю спросить в одном вопросе, объясните, пожалуйста, ответ в ответ, если возможно –
Другой пример [Катастрофический откат] (http://www.regular-expressions.info/catastrophic. html) –