Poiché ogni glob può essere scritto come un'espressione regolare e l'intersezione di due espressioni regolari può essere trovata (a meno che non siano realmente regolari, ma in questo caso si tratterebbe di), è possibile trovare l'intersezione di due globi trasformandoli in espressioni regolari e quindi trovandone l'intersezione. Quindi puoi scoprire se due globi si intersecano trovando l'intersezione delle espressioni regolari e controllando se è vuoto.
Tuttavia, poiché gocce sono più limitati rispetto espressioni regolari, c'è un modo molto facile:
Chiamiamo il g1 due gocce e g2. Si intersecano iff
- Entrambi g1 e g2 sono vuoti o contengono solo caratteri jolly.
- Né g1 né g2 sono vuote e una delle seguenti condizioni (diciamo c1 essere il primo carattere di g1 e t1 la stringa contenente i caratteri rimanenti - stesso per g2 con c2 e t2):
- c1 e c2 sono uguali e t1 e t2 intersecano
- c1 e/o c2 è un carattere jolly e t1 interseca con g2
- c1 e/o C2 è un carattere jolly e g1 interseca con t2
Un esempio di implementazione in 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
Questo algoritmo non è particolare efficiente se le gocce contengono un sacco di caratteri jolly, ma è molto facile da implementare e da allora è molto probabile intenzione di usare questo con i nomi dei file, ho dubito che avrai globi più lunghi di 1000 caratteri.
possibile duplicato di [Come si può rilevare se due regulano le espressioni ar si sovrappongono alle stringhe che possono corrispondere?] (http://stackoverflow.com/questions/1849447/how-can-you-detect-if-two-regular-expressions-overlap-in-the-strings-they- lattina) –
@ire_and_curses: non proprio. Questo problema può essere ridotto a quello che hai collegato, ma poiché questi tipi di glob sono rigorosamente meno potenti delle espressioni regolari, ci sono soluzioni che funzionano per glob, ma non funzionerebbero per le espressioni regolari. – sepp2k