Существуют ли какие-либо инструменты, которые будут принимать определенное регулярное выражение и возвращать худший сценарий с точки зрения количества операций, необходимых для определенного количества символов, с которыми сопоставляется регулярное выражение?
Так, например, если задано (f|a)oo.*[ ]baz
, сколько шагов может запустить движок через 100 символов?
Мне также было бы интересно, есть ли инструмент, который может взять кучу текстовых образцов и показывать средние операции для каждого прогона.
Я понимаю, что это будет зависеть от используемого двигателя и реализации, но я не знаю, насколько это распространено. Так что, если это распространено для многих языков (что делает мой вопрос слишком расплывчатым), меня особенно интересовали бы Perl и Python.
Отладчик Regexbuddy показывает, сколько шагов будет выполняться движком для завершения совпадения или нет в данном образце. Дополнительная информация о катастрофическом обратном отслеживании и отладка регулярных выражений.
PS: Это не бесплатно, но они предлагают 3-месячную гарантию возврата денег.
Обратите внимание, что это зависит от двигателя. Хотя теория регулярных выражений основана на теории прямых автоматов, большинство двигателей не являются строгими переводами этих теорий. По этой причине, например, некоторые двигатели подвергаются экспоненциальному времени, тогда как строгая обработка NFA не будет.
Вы можете получить то, что ищете, например, с помощью re.compile
с re.DEBUG
. См. отличный ответ из Python Hidden Features. Вики сообщества для подробного объяснения.
(x+x+)+y
ссылаемся ниже) допускают чисто автоматические автоматы с конечным числом состояний, но что обычные библиотеки регулярных выражений на самом деле реализуют библиотеки с возвратом, в значительной степени для поддержки таких причудливых вещей, как контекст. Инструмент, который вы описываете, был бы хорош при ловле en.wikipedia.org/wiki/…