Если в регулярных выражениях используются «расширенные функции» типичных процедурных совпадений (например, в Perl, Java, Python, Ruby и т. Д.), Которые позволяют принимать языки, которые не являются регулярными, тогда вам не повезло. Проблема вообще неразрешима. Например. проблема того, распознает ли один пусковой автомат один и тот же контекстный свободный (CF) язык, поскольку другой является неразрешимым. Расширенные регулярные выражения могут описывать языки CF.
С другой стороны, если в теоретическом смысле регулярные выражения являются «истинными», состоящими только из конкатенации, чередования и звезды Клейна над строками с конечным алфавитом, плюс обычный синтаксический сахар на этих (классы символов, +,? и т. д.), тогда существует простой полиномиальный алгоритм времени.
Я не могу дать вам библиотеки, но это:
For each pair of regexes r and s for languages L(r) and L(s)
Find the corresponding Deterministic Finite Automata M(r) and M(s)
Compute the cross-product machine M(r x s) and assign accepting states
so that it computes L(r) - L(s)
Use a DFS or BFS of the the M(r x s) transition table to see if any
accepting state can be reached from the start state
If no, you can eliminate s because L(s) is a subset of L(r).
Reassign accepting states so that M(r x s) computes L(s) - L(r)
Repeat the steps above to see if it's possible to eliminate r
Преобразование регулярных выражений в ДКА обычно использует конструкцию Томпсона, чтобы получить не-детерминированный автомат. Он преобразуется в DFA с использованием структуры подмножества. Перекрестная машина - еще один стандартный алгоритм.
Все это было разработано в 1960-х годах и в настоящее время является частью любого курса теории теории вычислительной техники. Золотой стандарт для этой темы - Hopcroft and Ullman, Automata Theory.
Не совсем уверен, что я понимаю - вы говорите, что у вас есть два регулярных выражения: 'a.c *' и 'abc *'? И вы не должны расшифровывать, если они одинаковые или частично одинаковые? Или это 'a.c * ⊃ abc *' целое регулярное выражение? Поскольку я никогда не видел эти обозначения до – SmokeyPHP
⊃ означает строгий надмножество, я, вероятно, должен был использовать ⊇, что является более распространенным явлением. Я пытаюсь сказать, что каждая строка, принятая 'abc *', также принимается 'a.c *' –
Каково ваше определение Regex? В большинстве языков программирования синтаксис регулярных выражений, который часто позволяет обратные ссылки, является более мощным, чем обычные языки. Поэтому разрешимость включения даже не ясна ... –