Ponieważ każdy glob może być zapisany jako wyrażenie regularne i można znaleźć przecięcie dwóch wyrażeń regularnych (o ile nie są one naprawdę regularne, ale w tym przypadku są), można znaleźć przecięcie dwóch globów przekształcając je w wyrażenia regularne, a następnie znajdując ich przecięcie. Możesz więc sprawdzić, czy dwa globsy przecinają się, znajdując przecięcie wyrażeń regularnych i sprawdzając, czy są puste.
Jednak ponieważ globs są bardziej ograniczone niż wyrażenie regularne, istnieje znacznie łatwiejszy sposób:
Nazwijmy G1 i G2 dwa Globs. Przecinają się między sobą, co oznacza, że:
- Zarówno g1, jak i g2 są puste lub zawierają tylko symbole wieloznaczne.
- Ani G1 ani G2 są puste i jeden z następujących warunków jest spełniony (niech c1 być pierwszym znakiem G1 i t1 ciąg zawierający pozostałe znaki - takie same dla g2 z C2 i t2):
- c1 i C2 są równe i T1 i T2 przecinają
- C1 i/lub C2 jest wieloznaczny t1 przecina g2
- C1 i/lub C2 jest wieloznaczne i G1 przecina t2
Przykładem wdrożenia w 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
Algorytm ten nie jest szczególnie skuteczne, jeżeli globs zawierają wiele symboli wieloznacznych, ale to jest bardzo łatwe do wykonania, a ponieważ jesteś prawdopodobnie planuje użyć ich nazw, I wątpię, że będziesz mieć kulki dłuższe niż 1000 znaków.
możliwy duplikat [Jak można wykryć, czy dwa regulatory wyrażenia ar pokrywają się w łańcuchach, które mogą dopasować?] (http://stackoverflow.com/questions/1849447/how-can-you-detect-if-dwa-regularne-wyrażenia-układania-w-tringach-to-- can-mat) –
@ire_and_curses: Niezupełnie. Ten problem może zostać zredukowany do tego, z którym się łączyłeś, ale ponieważ tego typu globs są ściśle mniej wydajne niż wyrażenia regularne, istnieją rozwiązania, które działają dla globów, ale nie działałyby dla wyrażeń regularnych. – sepp2k