Je travaille sur une réponse au même problème, ce que j'ai trouvé jusqu'à présent est ici: http://maple.cs.umbc.edu/~don/projects/ugrad-ht/dminer-ugradthesis.pdf
Il est un document de recherche de deuxième cycle en Perl regex, il a une définition pratique pour « plus spécifique regex 'et déclenche un avertissement s'il y a deux expressions regex de spécificité égale. Il est basé en partie sur le setfile de SELinux, mais vise à être plus rapide et plus précis. Setfile laisse le soin à l'utilisateur de faire en sorte que les correspondances vont du plus spécifique au moins spécifique, et prend la première correspondance. Cela peut causer certains problèmes que le document de recherche vise à résoudre.
Fondamentalement, la correspondance la plus spécifique est celle qui n'est pas un sur-ensemble d'une autre correspondance. La difficulté dans la solution est de déterminer quels ensembles sont des sur-ensembles d'autres ensembles; bien sûr, la réponse à cela dépend des circonstances pour lesquelles l'expression rationnelle est nécessaire. Une fois que vous avez la liste des super-ensembles, il devient alors inutile d'éliminer les correspondances. Donc, avec les expressions regex '^ /. *', '^/Usr /.*' et '^/home /.*', '^ /. *' Est un sur-ensemble des deux autres, tandis que les deux autres sont mutuellement exclusif. Dans une implémentation correcte, si les deux autres n'étaient pas mutuellement exclusifs (manquant le '^'), et aucun n'est un sur-ensemble de l'autre, un avertissement ou une erreur doit être émis à l'utilisateur. Pour une chaîne donnée, pour tester une correspondance, elle doit d'abord être vérifiée par rapport aux surensembles (dans ce cas '^ /. *'), Si elle ne correspond pas au surensemble, elle ne peut correspondre à aucun modèle spécifique. Si cela correspond, alors un test contre chacun des enfants du surensemble devrait être exécuté (ces ensembles peuvent aussi être des surensembles d'ensembles supplémentaires). Si elle ne correspond à aucun des enfants, alors l'expression rationnelle la plus spécifique est le surensemble ('^ /. *'). Si elle correspond à l'un des enfants, le processus doit se répéter avec les petits-enfants associés, jusqu'à ce qu'il n'y ait plus d'ensembles spécifiques ou qu'aucun ensemble spécifique ne corresponde.
Il peut être suffisant de ne pas émettre d'avertissement sur les non-super-ensembles non mutuellement exclusifs, à moins qu'une tentative de concordance de chaîne ne puisse être résolue. Considérons l'ensemble des expressions regex: '^ /. *', '/usr.*' et '/home.*'. La chaîne '/ home/usr' correspondrait aux trois, et une tentative de correspondance de celle-ci devrait générer une erreur, car il n'est pas clair si '/usr.*' ou '/home.*' est le plus régulier expression.En fonction des raisons pour lesquelles vous avez besoin de la solution, renvoyer une liste d'expressions régulières qui ne sont pas des sur-ensembles de toute autre regex correspondante peut être la solution idéale. Dans ce cas, '/ home/usr' devrait retourner '/home.*' et '/usr.*', mais pas '^ /. *'.
Le document ne contient aucun exemple de code, mais décrit uniquement la solution en termes abstraits. Je vais essayer d'écrire du code pour l'implémenter, ou peut-être envoyer un e-mail à l'auteur pour voir si je peux obtenir le code, si je reçois quelque chose qui fonctionne, je le posterai ici.
Ce n'est pas évident pour moi que le premier est «le plus spécifique». Quelle est votre définition de «plus spécifique» définir un algorithme pour cela et vous serez à mi-chemin là. Mais il me semble que la façon simple de le faire (comme Flex) est que vous avez plusieurs expressions qui correspondent exactement puis choisissez le premier défini dans vos données. –