加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

检查给定的正则表达式是否匹配任何内容

发布时间:2020-12-14 06:26:09 所属栏目:百科 来源:网络整理
导读:是否可以检查给定的正则表达式是否匹配任何字符串?具体来说,我正在寻找一个函数matchesEverything($ regex)返回true iff $regex将匹配任何字符串. 我想这相当于问,“给定正则表达式r,是否存在与r不匹配的字符串?”如果不在“所有字符串”的集合上放置边界,
是否可以检查给定的正则表达式是否匹配任何字符串?具体来说,我正在寻找一个函数matchesEverything($ regex)返回true iff $regex将匹配任何字符串.

我想这相当于问,“给定正则表达式r,是否存在与r不匹配的字符串?”如果不在“所有字符串”的集合上放置边界,我认为这是不可解决的.即,如果我认为字符串永远不会包含“blahblah”,那么我可以简单地检查r是否匹配“blahblah”.但是,如果没有这样的界限怎么办?我想知道这个问题是否可以解决,检查正则表达式r是否相当于.*.

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

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

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

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

我不认为PCRE是Turing-complete(虽然我不知道 – 也看到这个问题:Are Perl regexes turing complete?).如果是,那么我认为正如Jim Garrison评论的那样,这基本上就是停滞不前的问题.
也就是说,将它们转换为DFA也不容易,使上述方法无用……

我没有PCRE的答案,但要注意上述构造(反向引用等)会让我觉得很难.虽然我犹豫说“不可能”.

一个真正的Perl正则表达式中带有?{…}绝对是Turing-complete,所以有龙,我认为你运气不好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读