regex – 用于使用非常大的模式集进行字符串匹配的高效算法

我正在寻找一种能够找到与特定字符串匹配的所有模式的高效算法.模式集可以非常大(超过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

点赞