Если ваш механизм регулярных выражений демонстрирует экспоненциальное поведение во время выполнения для (x + x +) + y, то оно нарушено , поскольку DFA или NFA могут распознать этот шаблон за линейное время:
echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" | egrep "(x+x+)+y"
echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy" | egrep "(x+x+)+y"
оба отвечают сразу.
На самом деле, есть только несколько случаев (например, обратных ссылок), в которых действительно требуется обратное отслеживание (главным образом потому, что регулярное выражение с обратной ссылкой больше не является регулярным выражением в теоретическом смысле языка). Способная реализация должна переключиться на возврат только тогда, когда даны эти угловые случаи.
Справедливости ради, у DFA тоже есть и темная сторона, потому что у некоторых регулярных выражений есть экспоненциальные требования к размеру, но ограничения по размеру легче применить, чем ограничение по времени, и огромный DFA работает линейно на входе, так что это выгоднее, чем маленький бэктрекер задыхается от пары иксов.
Вы должны на самом деле прочитать превосходную серию статей Расса Кокса о реализации регулярных выражений (и патологическом поведении возврата): http://swtch.com/~rsc/regexp/
Чтобы ответить на ваш вопрос о разрешимости: вы не можете. Потому что для * regexpr нет возврата. Каждая реализация имеет свои собственные стратегии для экспоненциального роста их алгоритма в определенных случаях и не распространяется на другие. Здесь может быть одно правило и катастрофическое для него.
UPDATE:
Например, одна реализация может содержать оптимизатор, который может использовать алгебраические преобразования для упрощения регулярных выражений перед их выполнением: (x+x+)+y
- это то же самое, что и xxx*y
, что не должно быть проблемой для любого средства отслеживания. Но тот же оптимизатор не распознает следующее выражение, и проблема снова возникает. Здесь кто-то описал, как создать регулярное выражение, которое обманывает оптимизатор Perl:
http://perlgeek.de/blog-en/perl-tips/in-search-of-an-exponetial-regexp.html