Puisque chaque glob peut être écrit comme une expression régulière et que l'intersection de deux expressions régulières peut être trouvée (à moins qu'elles ne soient pas vraiment régulières, mais elles seraient dans ce cas), vous pouvez trouver l'intersection de deux globes en les transformant en expressions régulières et en trouvant l'intersection de celles-ci. Vous pouvez donc déterminer si deux globules se croisent en recherchant l'intersection des expressions régulières et en vérifiant si elles sont vides.
Cependant depuis globs sont plus limitées que l'expression régulière, il y a une beaucoup plus facile:
Appelons les deux petites boules g1 et g2. Ils se croisent ssi
- Les deux g1 et g2 sont vides ou contiennent uniquement des caractères génériques.
- Ni g1 ni g2 sont vides et l'une des conditions suivantes est remplie (Soit c1 le premier caractère de g1 et t1 la chaîne contenant les caractères restants - même pour g2 avec c2 et t2):
- c1 et c2 sont égaux et t1 et t2 se coupent
- c1 et/ou c2 est un caractère générique et t1 croise g2
- c1 et/ou c2 est un caractère générique et g1 intersection avec t2
Un exemple d'implémentation dans haskell:
intersect g1 [] = all (== '*') g1
intersect [] g2 = all (== '*') g2
intersect [email protected]('*':t1) [email protected](c2:t2) = intersect g1 t2 || intersect t1 g2
intersect [email protected](c1:t1) [email protected]('*':t2) = intersect t1 g2 || intersect g1 t2
intersect (c1:t1) (c2:t2) = c1 == c2 && intersect t1 t2
Cet algorithme n'est pas particulièrement efficace si les globs contiennent beaucoup de jokers, mais il est très facile à mettre en œuvre et que vous envisagez probablement l'utiliser avec les noms de fichiers, je doute que vous aurez plus de 1000 globs globs.
duplication possible de [Comment pouvez-vous détecter si deux régulent ar expressions se chevauchent dans les chaînes qu'ils peuvent correspondre?] (http://stackoverflow.com/questions/1849447/how-can-you-detect-if-two-regular-expressions-overlap-in-the-strings-they- can-mat) –
@ire_and_curses: Pas vraiment. Ce problème peut être réduit à celui que vous avez lié, mais puisque ces types de globs sont strictement moins puissants que les expressions régulières, il y a des solutions qui fonctionnent pour les globs, mais qui ne fonctionneraient pas pour les expressions régulières. – sepp2k