【发布时间】:2013-07-30 18:21:52
【问题描述】:
是否可以检查给定的正则表达式是否匹配任何字符串?具体来说,我正在寻找一个返回 true 的函数 matchesEverything($regex),如果 $regex 将匹配任何字符串。
我想这相当于问,“给定一个正则表达式r,是否存在与r 不匹配的字符串?”如果不对“所有字符串”设置界限,我认为这是无法解决的。即,如果我假设字符串永远不会包含“blahblah”,那么我可以简单地检查r 是否匹配“blahblah”。但是如果没有这样的界限呢?我想知道这个问题是否可以通过检查正则表达式r 是否等于.* 来解决。
【问题讨论】:
-
我相信这相当于Halting Problem。可能无法编写算法来确定任意正则表达式是否等效于
.* -
具有环视和反向引用但没有代码插值的正则表达式应该是或等于上下文敏感语法的子集。决定这些语言不是图灵完备的,因此这个问题不应该等同于停机问题。 如果,给定一个 CSG,我们可以通过替换规则生成该语言的字符串,然后我们可以应用禁止替换,从而生成一个不在我们语言中的字符串。可悲的是,我不知道情况是否如此,而且我无法草拟证据。
-
这被称为“空性问题”,对于 DFA/NFA(即没有反向引用/环视的正则表达式)是可判定的cs.miami.edu/~ogihara/csc527/new04-1.pdf 对于带有反向引用(上下文敏感语法)的正则表达式,空性问题是不可判定的. (我现在找不到证据,但在文献中经常提到)