Позвольте мне начать с того, что я понятия не имею, как создать такой алгоритм, и я не знаю ни одной библиотеки, которая его реализует. Однако я не удивлюсь, если узнаю, что для общих регулярных выражений произвольной сложности существует не такое число.
Каждое регулярное выражение определяет регулярный язык всех строк, которые могут быть сгенерированы выражением, или, если вы предпочитаете, всех строк, которые "соответствуют" регулярному выражению. Думайте о языке как о множестве строк. В большинстве случаев набор будет бесконечно большим. Ваш вопрос спрашивает, являются ли пересечения двух множеств, заданных регулярными выражениями, пустыми или нет.
По крайней мере, в первом приближении, я не могу представить способ ответить на этот вопрос без вычисления множеств, что для бесконечных множеств займет больше времени, чем у вас. Я думаю, что мог бы быть способ вычислить ограниченный набор и определить, когда шаблон разрабатывается сверх того, что требуется другим регулярным выражением, но это не будет простым.
Например, просто рассмотрим простые выражения (ab)*
и (aba)*b
. Каков алгоритм, который решит сгенерировать abab
из первого выражения, а затем остановиться, не проверяя ababab
, abababab
и т. Д., Потому что они никогда не будут работать? Вы не можете просто генерировать строки и проверять, пока не будет найдено совпадение, потому что это никогда не завершится, когда языки не пересекаются. Я не могу представить себе ничего, что могло бы сработать в общем случае, но есть люди, которые намного лучше меня в таких вещах.
В общем, это сложная проблема. Я был бы немного удивлен, узнав, что существует решение за полиномиальное время, и я бы не удивился, узнав, что оно эквивалентно проблеме остановки. Хотя, учитывая, что регулярные выражения не являются полными по Тьюрингу, представляется, что, по крайней мере, возможно, что решение существует.