Подтвердить что ты не робот

Анализ худших случаев для регулярных выражений

Существуют ли какие-либо инструменты, которые будут принимать определенное регулярное выражение и возвращать худший сценарий с точки зрения количества операций, необходимых для определенного количества символов, с которыми сопоставляется регулярное выражение?

Так, например, если задано (f|a)oo.*[ ]baz, сколько шагов может запустить движок через 100 символов?

Мне также было бы интересно, есть ли инструмент, который может взять кучу текстовых образцов и показывать средние операции для каждого прогона.

Я понимаю, что это будет зависеть от используемого двигателя и реализации, но я не знаю, насколько это распространено. Так что, если это распространено для многих языков (что делает мой вопрос слишком расплывчатым), меня особенно интересовали бы Perl и Python.

4b9b3361

Ответ 1

Отладчик Regexbuddy показывает, сколько шагов будет выполняться движком для завершения совпадения или нет в данном образце. Дополнительная информация о катастрофическом обратном отслеживании и отладка регулярных выражений.

catastrophic backtracking shown in RegexBuddy

PS: Это не бесплатно, но они предлагают 3-месячную гарантию возврата денег.

Ответ 2

Обратите внимание, что это зависит от двигателя. Хотя теория регулярных выражений основана на теории прямых автоматов, большинство двигателей не являются строгими переводами этих теорий. По этой причине, например, некоторые двигатели подвергаются экспоненциальному времени, тогда как строгая обработка NFA не будет.

Ответ 3

Вы можете получить то, что ищете, например, с помощью re.compile с re.DEBUG. См. отличный ответ из Python Hidden Features. Вики сообщества для подробного объяснения.