适合于将字符串与正则表达式模式匹配的数据库或结构

时间:2009-03-05 09:43:22

标签: database regex search data-structures

我有许多正则表达式模式。输入字符串时,我必须找到与此字符串匹配的所有模式。这通常是 O(n)操作:

SELECT regex FROM regexes WHERE 'string' RLIKE regex

最快的方法是什么?是否存在针对此类操作进行优化的数据库结构或存储系统?

2 个答案:

答案 0 :(得分:5)

简短回答是'不'目前在任何DBMS平台上都没有索引结构可以索引像这样的正则表达式的部分匹配。

长答案是通配符匹配的前导常量(例如'foo_')可以用作索引匹配的前缀。许多DBMS平台将对此进行优化并使用索引(如果可用)来解析前缀。但是,这并不像完整的正则表达式那样聪明,只有在你有一个常量前缀时才能使用索引。

更长的答案是,有RETE之类的算法会优化像这样的部分匹配。如果您可以将匹配表达为正向链接生成规则而不是正则表达式,则可能适用。

Rete通过计算部分匹配并仅显示可以从此部分匹配到达的规则来工作,因此它比O(n)更有效(更像是O(log n)但我不确定确切的时间复杂性)将n个规则与事实相匹配。

答案 1 :(得分:2)

如果适用于您的情况,您可以实施的一项优化是对您的正则表达式进行分类,并将其组织在层次结构中,以便:

  • 你只需要测试一些最通用的正则表达式。

  • 对于匹配的任何常规正则表达式,然后继续针对同一类别的所有正则表达式测试字符串。

例如,如果您的输入字符串可以是任意复杂的,并且您有数千个正则表达式,则可以按以下类别组织它们:

  • \d+类别,会测试数字模式(SSN,电话号码等)

  • <.*?>类别,用于测试HTML标记的存在

  • \w+@\w+类别,可以测试是否存在电子邮件地址

如果任何根模式不匹配,那么您就不必测试无论如何都会失败的整个模式范围。

不知道这是否与您的确切域匹配,但这可能是一种优化。