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

48

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

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

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

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

  • 0
    Отличный вопрос! Очевидно, это будет зависеть от регулярного выражения. Хорошо известно, что чистые регулярные выражения (даже как пример (x+x+)+y ссылаемся ниже) допускают чисто автоматические автоматы с конечным числом состояний, но что обычные библиотеки регулярных выражений на самом деле реализуют библиотеки с возвратом, в значительной степени для поддержки таких причудливых вещей, как контекст. Инструмент, который вы описываете, был бы хорош при ловле en.wikipedia.org/wiki/…
Теги:
optimization
analysis

3 ответа

21

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

Изображение 7733

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

  • 1
    Я играл с этим - Джефф был фанатом этого: codinghorror.com/blog/2004/07/my-buddy-regex.html . Но я думал немного более программно и ориентирован на оптимизацию - если это имеет смысл.
11

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

7

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню