【问题标题】:Check if a given regex will match anything检查给定的正则表达式是否匹配任何内容
【发布时间】: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 对于带有反向引用(上下文敏感语法)的正则表达式,空性问题是不可判定的. (我现在找不到证据,但在文献中经常提到)

标签: regex string perl


【解决方案1】:

这并不能完全回答你的问题,但希望能解释一下为什么很难得到一个简单的答案:

首先,“正则表达式”这个词有点模糊,所以为了澄清,我们有:

  • “严格”正则表达式,相当于确定性有限自动机 (DFA)。
  • 与 Perl 兼容的正则表达式 (PCRE),它添加了一堆花里胡哨的功能,例如前瞻、反向引用等。这些功能也可以在 Python 和 Java 等其他语言中实现。
  • 实际的 Perl 正则表达式,通过 ?{...} 构造可以变得更加疯狂,包括任意 Perl 代码。

我认为这个问题对于严格的正则表达式是可以解决的。您只需构建相应的 DFA 并搜索该图以查看是否有任何路径可以到达不接受状态。但这对“现实世界”的正则表达式没有帮助,通常是 PCRE。

我不认为 PCRE 是图灵完备的(虽然我不知道 - 也请参阅这个问题:Are Perl regexes turing complete?)。如果是这样,那么我认为正如 Jim Garrison 评论的那样,这基本上是停止问题。 也就是说,将它们转换为DFA也并不容易,使上述方法无用......

我没有关于 PCRE 的答案,但请注意,我想,上述构造(反向引用等)会使它变得非常困难。虽然我不敢说“不可能”。

带有?{...} 的真正 Perl 正则表达式绝对是图灵完备的,所以会有龙,我认为你不走运。

【讨论】:

  • 很好的回复。你强化了我的想法。对于我要解决的用例,任何实际的 perl 正则表达式都是我关心的。几乎所有eval{ 'xx' =~ m/$regex/i; } 导致成功评估的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
相关资源
最近更新 更多