我正在寻找一种能够找到与特定字符串匹配的所有模式的高效算法.模式集可以非常大(超过100,000)和动态(随时添加或删除模式).模式不一定是标准正则表达式,它们可以是正则表达式的子集或类似于
shell模式的东西(即:file – * .txt).优选正则表达子集的解决方案(如下所述).
仅供参考:基于RegExp列表,我对蛮力方法不感兴趣.
通过简单的正则表达式,我的意思是一个支持?,*,,字符类[a-z]和可能的逻辑运算符|的正则表达式.
为了澄清我的需要:我希望找到与URL匹配的所有模式:
http://site1.com/12345/topic/news/index.html
响应应该是基于下面设置的模式的这些模式.
http://*.site1.com/*/topic/*
http://*.site1.com/*
http://*
图案集:
http://*.site1.com/*/topic/*
http://*.site1.com/*/article/*
http://*.site1.com/*
http://*.site2.com/topic/*
http://*.site2.com/article/*
http://*.site2.com/*
http://*
最佳答案 想到的一种方法是创建模式的树结构.
示例:http:// *将包含所有模式(如上所列). http://*.site1.com/*将包含所有site1.com.这可以显着减少需要检查的模式数量.
此外,您可以确定哪些模式是互斥的,以进一步修剪您搜索的列表.
因此,首先采取所有模式并从中创建树木.搜索所有根以确定需要分析哪些分支和节点.
通过确定哪些分支是互斥的来改进算法,因此一旦在给定分支上找到命中,就会知道不需要访问哪些分支/节点.
要开始你可能是懒惰的,你的第一个传递可能是对模式进行排序,并做简单的下一个模式包含此模式类型逻辑,以确定下一个是否包含“this”. EX:if(“http://*.site1.com/*”.startsWith(“http:// *”)== true)
您可以更精确地确定一个模式是否确实包含另一个模式,但这可以帮助您入门.
为了更好地确定问题:
“Does this pattern contain that pattern?”
我相信你需要能够解析正则表达式…这篇文章看起来像是一个开始理解如何实现它的好地方:Parsing regular expressions with recursive descent