Поскольку каждый глобус может быть записан как регулярное выражение, и можно найти пересечение двух регулярных выражений (если они не являются действительно регулярными, но они были бы в этом случае), вы можете найти пересечение двух глобусов преобразуя их в регулярные выражения, а затем найдя их пересечение. Таким образом, вы можете узнать, пересекаются ли два глобуса, найдя пересечение регулярных выражений и проверяя, является ли он пустым.
Однако поскольку шарики более ограничены, чем регулярные выражения, есть гораздо простой способ:
Давайте назовем два комков g1 и g2. Они пересекаются, если
- Оба g1 и g2 пусты или содержат только символы.
- Ни g1, ни g2 являются пустыми и один из следующих условий (пусть c1 быть первым символом g1 и t1 строка, содержащая оставшиеся символы - то же самое для g2 с c2 и t2):
- c1 и c2 равны и t1 и t2 пересекаются
- c1 и/или c2 является подстановочным и t1 пересекается с g2
- c1 и/или c2 является подстановочным и g1 пересекается с t2
Пример реализации в 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
Этот алгоритм не особенно эффективно, если шарики содержат много масок, но это очень легко реализовать и, так как вы, вероятно, планирует использовать это с именами файлов, я сомневайтесь, что у вас будут глобусы длиной более 1000 символов.
возможно дубликат [Как вы можете обнаружить, если два REGUL А.Р. выражения перекрываются в строках они могут совпадать?] (http://stackoverflow.com/questions/1849447/how-can-you-detect-if-two-regular-expressions-overlap-in-the-strings-they- can-mat) –
@ire_and_curses: Не совсем. Эта проблема может быть сведена к той, которую вы связали, но поскольку эти типы глобусов строго менее эффективны, чем регулярные выражения, существуют решения, которые работают для глобусов, но не будут работать для регулярных выражений. – sepp2k