Vì mọi glob có thể được viết dưới dạng biểu thức chính quy và có thể tìm thấy giao điểm của hai biểu thức chính quy (trừ khi chúng không thực sự bình thường, nhưng chúng sẽ nằm trong trường hợp này), bạn có thể tìm thấy giao điểm của hai bóng bằng cách chuyển đổi chúng thành các biểu thức chính quy và sau đó tìm giao điểm của những biểu thức đó. Vì vậy, bạn có thể tìm hiểu xem hai bóng đèn giao nhau bằng cách tìm giao điểm của cụm từ thông dụng và kiểm tra xem nó có trống không.
Tuy nhiên kể từ khi những đống có nhiều hạn chế hơn so với biểu hiện thường xuyên, có một cách nhiều dễ dàng hơn:
Hãy gọi hai globs g1 và g2. Họ cắt nhau iff
- Cả g1 và g2 đều trống hoặc chỉ chứa ký tự đại diện.
- Cả g1 cũng không g2 là trống rỗng và là một trong các điều kiện sau đây là đúng (giả sử c1 là nhân vật đầu tiên của g1 và t1 các chuỗi chứa ký tự còn lại - tương tự cho g2 với c2 và t2):
- c1 và c2 đều bình đẳng và t1 và t2 giao
- c1 và/hoặc c2 là một ký tự đại diện và t1 giao cắt với g2
- c1 và/hoặc c2 là một ký tự đại diện và g1 giao cắt với t2
An thực hiện ví dụ trong 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
thuật toán này không phải là đặc biệt hiệu quả nếu những đống chứa rất nhiều ký tự đại diện, nhưng nó rất dễ dàng để thực hiện và vì bạn đang có khả năng lên kế hoạch sử dụng điều này với tên tập tin, tôi nghi ngờ bạn sẽ có globs dài hơn 1000 ký tự.
bản sao có thể có của [Làm cách nào bạn có thể phát hiện nếu hai quy tắc biểu thức ar chồng lên nhau trong các chuỗi mà chúng có thể khớp?] (http://stackoverflow.com/questions/1849447/how-can-you-detect-if-two-regular-expressions-overlap-in-the-strings-they- can-mat) –
@ire_and_curses: Không thực sự. Vấn đề này có thể được giảm xuống thành một trong những bạn liên kết, nhưng vì những loại bóng này là ít mạnh hơn các biểu thức thông thường, có những giải pháp làm việc cho globs, nhưng sẽ không hoạt động cho các biểu thức thông thường. – sepp2k