Si les expressions régulières utilisent des "fonctionnalités avancées" de matchers procéduraux typiques (comme ceux de Perl, Java, Python, Ruby, etc.) qui permettent d'accepter des langages qui ne sont pas réguliers, alors vous n'avez pas de chance. Le problème est en général indécidable. Par exemple, le problème de savoir si un automate pushdown reconnaît le même langage sans contexte (CF) qu'un autre est indécidable. Les expressions régulières étendues peuvent décrire les langages CF.
D'un autre côté, si les expressions régulières sont "vraies" au sens théorique du terme, c'est-à-dire qu'elles consistent uniquement en une concaténation, une alternance et une étoile de Kleene sur des chaînes de caractères à alphabet fini, plus le sucre syntaxique habituel (classes de caractères, +, ?, etc.), alors il existe un algorithme simple en temps polynomial.
Je ne peux pas vous donner des bibliothèques, mais ceci :
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
La conversion d'une regex en un DFA utilise généralement la construction de Thompson pour obtenir un automate non-déterministe. Celui-ci est converti en un TFD en utilisant la construction de sous-ensembles. La machine à produits croisés est un autre algorithme standard.
Tout cela a été mis au point dans les années 1960 et fait désormais partie de tout bon cours théorique d'informatique de premier cycle. La référence en la matière est Hopcroft et Ullman, Théorie des automates .