【发布时间】:2011-10-11 21:34:04
【问题描述】:
计算两个任意正则表达式是否有任何重叠的解决方案(假设有可能)。
例如,这两个正则表达式可以通过蛮力证明没有交集,因为这两个解集是可计算的,因为它是有限的。
^1(11){0,1000}$ ∩ ^(11){0,1000}$ = {}
{1,111, ..., ..111} ∩ {11,1111, ..., ...11} = {}
{} = {}
但是将{0,1000} 替换为* 消除了暴力解决方案的可能性,因此必须创建更智能的算法。
^1(11)*$ ∩ ^(11)*$ = {}
{1,^1(11)*$} ∩ {^(11)*$} = {}
{1,^1(11)*$} ∩ {11,^11(11)*$} = {}
{1,111,^111(11)*$} ∩ {11,^(11)*$} = {}
.....
在另一个similar question 一个answer 是计算交集正则表达式。那有可能吗?如果是这样,如何编写算法来做这样的事情?
我认为这个问题可能是halting problem 的域。
编辑:
我已使用公认的解决方案为示例问题创建 DFA。很容易看出如何在 M_3 的状态图上使用 BFS 或 DFS 来确定来自 M_3 的最终状态是否可达。
【问题讨论】:
-
链接的问题有一些很好的答案。为什么在您看来这不是重复的? IOW,请激发这种“改革”的合法性?
-
链接的问题产生了许多理论答案。我喜欢提出的这个问题,因为它明确地邀请了一个实际的解决方案。它让我想起了我今年早些时候提出的一个问题,其动机仅仅是为了有效地评估 ~100 个正则表达式与 ~10^9 个字符串。仅当用于计算关系的逻辑有效时,才在这种情况下“预先计算”正则表达式“关系”(正交性、>、
标签: regex algorithm language-agnostic set intersection