Как и предполагал Qtax, выражение
n(e(e(d(l(e)?)?)?)?)?|e(e(d(l(e)?)?)?)?|e(d(l(e)?)?)?|d(l(e)?)?|l(e)?|e
будет подходящим вариантом, если вы хотите написать явное регулярное выражение (синтаксис egrep
, необязательно заменить (...)
на (?:...)
).Причина, по которой это лучше, чем первоначальное решение, заключается в том, что сжатой версии требуется только пространство O (n ^ 2) по сравнению с пространством O (n ^ 3) в исходной версии, где n
- длина входных данных.Попробуйте это с extraordinarily
в качестве ввода, чтобы увидеть разницу.Я предполагаю, что сжатая версия также быстрее со многими механизмами регулярных выражений.
Выражение
nee(d(l(e)?)?)?|eed(l(e)?)?|edl(e)?|dle
будет искать подстроки длиной 3 или более.
Как указывает vhallac, сгенерированные регулярные выражения немного избыточны и могут быть оптимизированы.Помимо предложенного инструмента Emacs, есть пакет Perl Regexp :: Optimizer , который, как я надеялся, поможет здесь, но быстрая проверка не удалась для первого регулярного выражения.
Обратите внимание, что многие регулярные выражения regexpПо умолчанию движки выполняют поиск без наложения.Проверьте это с требованиями вашей проблемы.