如何确定列表中的哪些正则表达式可能重叠

时间:2019-10-02 03:44:28

标签: mysql regex perl

我有一个正则表达式表,该表位于与文本匹配的MySQL表中。

有没有一种方法可以使用MySQL或任何其他语言(最好是Perl)来获取此表达式列表,并确定其中哪些可以重叠。这应该与表达式中提供的任何文本无关。

所有表达式都有锚点。

以下是我要获取的示例:

表达式:

^a$
^b$
^ab
^b.*c
^batch
^catch

结果: '^b.*c' and '^batch' MAY overlap

有想法吗?

谢谢, 斯科特

进一步的解释:

我有一个用户创建的正则表达式列表和一个将与正则表达式匹配的导入字符串列表。在这种情况下,字符串是“干净的”数据(即不是用户创建的,而是从其他来源导入的-不得更改)。

当用户添加到正则表达式列表中时,我既不希望现有字符串列表也不希望任何未来字符串发生冲突(无法提前猜测-唯一的限制是它们不再是ASCII可打印字符超过255个字符)。

一种蛮力方法是创建一个所有字符串排列的“彩虹”表,并且每次添加一个正则表达式时,都会对彩虹表运行所有正则表达式。但是我想避免这种情况(我什至不确定成本),所以大声地想知道一种算法的可能性,该算法至少可以显示列表中的正则表达式可能会发生冲突。

1 个答案:

答案 0 :(得分:0)

我将在全部RE上投入资金。甚至仅限于BRE和/或MySQL-pre-8.0都是具有挑战性的。这是一些想法。

  • 如果端部固定且没有+*,则计算长度。固定长度可以用作鉴别符。同样,它也可以用来将“蛮力”调低一个数量级。
  • 为简单起见,后面跟着+*的所有内容都将变成.*。 (请参阅“可能发生碰撞”规则。)
  • 在任何情况下,任何带有显式字符的RE(包括后跟+的字符)都将成为区分符。例如^a.*b$^a.*c$
  • 对于那些锚定在末端的人,请反转图案并进行测试。 (我不知道换向有多困难。)
  • 如果您可以说某个特定字符必须在任意位置,则将其用作鉴别符:pos 1中的^a.b.*c$-a;位置3中的bc结尾。也许可以将其扩展到字符类:^\w可以匹配,但是^\d^a.*\d$不能匹配。