Dado que cada globo se puede escribir como una expresión regular y se puede encontrar la intersección de dos expresiones regulares (a menos que no sean realmente regulares, pero lo serían en este caso), puede encontrar la intersección de dos globos transformándolos en expresiones regulares y luego encontrando la intersección de esos. Para que pueda averiguar si dos globos se cruzan, encuentre la intersección de las expresiones regulares y verifique si está vacío.
Sin embargo, desde globos son más limitadas que la expresión regular, hay una manera mucho más fácil:
Vamos a llamar a la G1 y G2 dos globos. Se cruzan iff
- Tanto g1 como g2 están vacíos o solo contienen comodines.
- Ni G1 ni g2 están vacías y una de las siguientes condiciones es verdadera (vamos a c1 en el primer carácter del G1 y T1, la cadena que contiene los caracteres restantes - mismo para g2 con C2 y T2):
- c1 y c2 son iguales y t1 y t2 se cruzan
- c1 y/o c2 es un comodín y t1 se cruza con g2
- c1 y/o c2 es un comodín y g1 cruza con t2
un ejemplo de implementación en 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
Este algoritmo no es especialmente eficiente si los globos contienen una gran cantidad de comodines, pero es muy fácil de implementar y puesto que es muy probable que planean usar esto con los nombres de archivo, me duda que tendrá globos de más de 1000 caracteres.
posible duplicado de [¿Cómo se puede detectar si dos regul ar expresiones se superponen en las cadenas que pueden coincidir?] (http://stackoverflow.com/questions/1849447/how-can-you-detect-if-two-regular-expressions-overlap-in-the-strings-they- can-mat) –
@ire_and_curses: No realmente. Este problema se puede reducir al que vinculó, pero dado que estos tipos de globs son estrictamente menos poderosos que las expresiones regulares, existen soluciones que funcionan para globs, pero que no funcionarían para expresiones regulares. – sepp2k