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

Mysql 如何确定列表中哪些正则表达式可能重叠,mysql,regex,perl,Mysql,Regex,Perl,我在MySQL表中有一个正则表达式表,我将文本与之匹配 有没有一种方法,使用MySQL或任何其他语言(最好是Perl),我可以获取这个表达式列表,并确定其中哪些可能重叠。这应该独立于表达式可能提供的任何文本 所有表达式都有锚 以下是我想要得到的一个例子: 表达方式: ^a$ ^b$ ^ab ^b.*c ^batch ^catch 结果: “^b.*c”和“^batch”可能重叠 想法 谢谢, 斯科特 进一步解释: 我有一个用户创建的正则表达式列表和一个要与正则表达式匹配的字符串导入列表。在这种

我在MySQL表中有一个正则表达式表,我将文本与之匹配

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

所有表达式都有锚

以下是我想要得到的一个例子:

表达方式:

^a$
^b$
^ab
^b.*c
^batch
^catch
结果:
“^b.*c”和“^batch”可能重叠

想法

谢谢, 斯科特

进一步解释:

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

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


蛮力方法是创建一个包含所有字符串排列的“rainbow”表,每次添加正则表达式时,根据rainbow表运行所有正则表达式。然而,我想避免这种情况(我甚至不确定成本),因此我大声想知道是否有一种算法可以至少显示列表中哪些正则表达式可能发生冲突。

我将赌全分辨率。即使限制在BRE和/或MySQL-pre-8.0也将是一个挑战。以下是一些想法

  • 如果端部固定且无
    +
    *
    ,则计算长度。固定长度可以用作鉴别器。此外,它还可以用来缓和“暴力”的影响,也许可以达到一个数量级
  • 为了简单起见,任何后跟
    +
    *
    的内容都会转换为
    *
    。(重新定义“可能碰撞”规则。)
  • 任何带有显式字符的RE(包括后跟
    +
    的RE)在某些情况下会成为鉴别器。例如,
    ^a.*b$
    vs
    ^a.*c$
  • 对于那些锚定在末端的,反转模式并以这种方式进行测试。(我不知道倒车有多困难。)
  • 如果您可以说某个特定字符必须位于任何位置,请将其用作鉴别器:
    ^a.b.*c$
    --
    a
    ,位置1<位置3中的代码>b<代码>c在末尾。也许这可以扩展到字符类:
    ^\w
    可以匹配,但是
    ^\d
    ^a.*\d$
    不能匹配

我将在全分辨率上下赌注。即使限制在BRE和/或MySQL-pre-8.0也将是一个挑战。以下是一些想法

  • 如果端部固定且无
    +
    *
    ,则计算长度。固定长度可以用作鉴别器。此外,它还可以用来缓和“暴力”的影响,也许可以达到一个数量级
  • 为了简单起见,任何后跟
    +
    *
    的内容都会转换为
    *
    。(重新定义“可能碰撞”规则。)
  • 任何带有显式字符的RE(包括后跟
    +
    的RE)在某些情况下会成为鉴别器。例如,
    ^a.*b$
    vs
    ^a.*c$
  • 对于那些锚定在末端的,反转模式并以这种方式进行测试。(我不知道倒车有多困难。)
  • 如果您可以说某个特定字符必须位于任何位置,请将其用作鉴别器:
    ^a.b.*c$
    --
    a
    ,位置1<位置3中的代码>b<代码>c在末尾。也许这可以扩展到字符类:
    ^\w
    可以匹配,但是
    ^\d
    ^a.*\d$
    不能匹配

通过“可能重叠”您的意思是说
^b.*c
^\w+
^b.+
都匹配
批处理
(因此它们对该字符串“重叠”)?如果您对正则表达式使用的模式有严格限制,请在此处详细说明,否则问题似乎相当于对正则表达式引擎进行反向工程。
^a$
^b$
将永远不会匹配相同的字符串<代码>^b.*c和
^\w+
^b.+
可能匹配,具体取决于提供的字符串(是,例如
批处理
)。我想知道是否有一种简单的方法来确定两个正则表达式是否匹配。不,我不想强逼它:)好的,谢谢你的澄清。然后,您需要对引擎进行反向工程(或多或少)。如何通过编程判断
^\w+
^b
是否可以匹配同一个字符串?程序必须分析给定列表中的正则表达式,以便播放引擎,然后变出一个可能的字符串,该字符串与列表中的正则表达式重叠匹配。对一个程序来说,似乎有很多要求。好吧,判定两个正则表达式的等价性是p-难的,判定两个正则表达式是否重叠是np-难的。根据您想做什么,蛮力可能是一个不错的选择(因为您可能很清楚使用它的目的是什么样的字符串,所以可以准备一个合适的测试列表)。和/或您可能想要详细说明您的用例,也许有一种不同的方式来实现您的目标/制定您的问题。或者你可能想继续询问算法想法/复杂性考虑。“当用户添加到正则表达式列表中时”-没有任何限制(除了提到的锚)?所以我添加了一些疯狂的正则表达式,包括lookarounds和分支等等。。。程序需要弄清楚它不可能匹配与另一个讨厌的正则表达式匹配的字符串相同的字符串?我认为您只能显式地检查您拥有的字符串,因此“暴力”是指“可能重叠”您的意思是说
^b.*c
^\w+
^b+