任何人都知道如何调整搜索树来处理有限的正则表达式?给定文件名,任务是查找与该文件名匹配的所有节点。节点可能包含通常的文件名globs(*和?)。显然,由于这是一个搜索树,速度至关重要。
编辑:我应该补充一点,速度最重要的情况是排除比赛的平均时间。也就是说,在大多数情况下,匹配将失败。
示例:假设树包含以下节点:
foo,bar,foo *,* bar,foo?bar
搜索foo将返回节点1和3。 搜索栏将返回节点2和4。 搜索FOB将不返回任何节点。 搜索fooxbar将返回节点5。 搜索foobar将返回节点3和4。
答案 0 :(得分:9)
aho-corasick搜索树符合要求。 Aho-Corasick关于此类事件Tries的非常好的文章,以及Evolution中用于替换正则表达式搜索的实现Etrie
编辑:要进行整个字符串匹配,可以添加开始和结束锚状态,如果扫描多行数据,则可以添加新行开始和结束。您还可以删除添加交叉链接的部分,以便开始不同匹配的部分匹配,这也允许更快的排除。
检查字符串集中成员资格的另一种算法是CritBit。这没有正则表达式,但它很简单并且测试完整的字符串。