Мне была предоставлена ссылка на следующую статью, посвященную внедрению регулярных выражений на многих современных языках.
http://swtch.com/~rsc/regexp/regexp1.html
TL; DNR: некоторые регулярные выражения, такие как (a?)^na^n
для фиксированного $n $, принимают экспоненциальное время, сопоставляемое, скажем, a^n
, потому что оно реализовано путем обратного отслеживания строки при сопоставлении раздела ?
. Реализация этих как NFA путем хранения списков штатов делает это намного более эффективным по очевидным причинам.
Детали того, как каждый язык на самом деле реализует их, не очень детализированы (и статья старая), но мне любопытно: что, если таковые имеются, являются недостатками использования NFA в отличие от других методов реализации. Единственное, что я могу придумать, это то, что со всеми колокольчиками большинства библиотек: а) создание NFA для всех этих функций нецелесообразно или б) между выражением выше и некоторыми другими, возможно, общий, работа.