如何为正则表达式集合找到“最小生成集”?

时间:2011-05-02 18:25:30

标签: regex performance minimum-spanning-tree partial-ordering

背景:

我有一个小的(目前不到100个)但正在增长的正则表达式集合,我想优化确定给定文本字符串的过程我的集合中哪些RE与文本字符串匹配。

有些RE有一个排序关系 - 例如,如果我知道字符串$ t匹配/ windows / i,那么我也知道$ t匹配/windows.*2000/i。因此,当我对我的集合中的RE测试$ t时,我可以跳过测试/ windows / i,如果我已经针对/windows.*2000/i测试了$ t并找到了匹配(尽管如果/windows.*2000/i确实如此) not 匹配当然我无法跳过针对/ windows / i的测试。

请注意,我的集合中的所有RE都不是完全等效的(对于任何一对RE,至少有一个文本字符串匹配一个,并且匹配另一个)。

策略:

我想构建一个有向图G,其中包含我的集合中每个RE的节点,以及具有排序关系的每对RE的有向边(A - > B表示“与A匹配意味着与B匹配”) ,找到图的节点的“最小生成集”(最小的节点集S,使得G中的每个节点都位于源自S的有向路径上)。

EASY PART:

有很多免费的算法可用于定向非循环图。因此,一旦为我的RE集合构建了图形G(这是不同的,应该保证G是非循环的),我不希望找到一个合适的算法来找到G的最小生成集。

我需要帮助的地方:

我想找到一种有效的方法来查找我的集合中RE之间的所有排序关系 - 也许还要确保集合中没有两个RE是等价的(我需要一种方法来自动验证这个新增REs)。

我的(基本上是随机的)网络搜索因此提出了至少一个合理的主张,即计算两个RE之间存在什么(如果有的话)排序关系的合理方式确实存在,但尚未发现任何描述完整的算法。

有没有人知道现有的实现(用于比较RE),这些实现是合理有效的,免费提供的,并且(理想情况下)是用一种流行的脚本语言或C / C ++实现的?

1 个答案:

答案 0 :(得分:2)

我不确定您是否在需要使用的正则表达式库方面具有灵活性,但您可以查看其RE2接口可以同时匹配多个正则表达式的Set。请注意,RE2主要使用DFA方法,并不支持其他(主要是回溯)实现所具有的所有正则表达式功能。