正则表达式匹配正则表达式

时间:2014-04-18 20:54:26

标签: regex

有没有人试图描述与正则表达式匹配的正则表达式?

由于重复的关键字,几乎无法在网络上找到此主题。

它可能在实际应用程序中无法使用,因为支持正则表达式的语言通常有一个解析它们的方法,我们可以用它来进行验证,以及一种在代码中分隔正则表达式的方法,可以使用用于搜索目的。

但我仍然想知道匹配所有正则表达式的正则表达式是怎样的。应该可以写一个。

2 个答案:

答案 0 :(得分:6)

我没有这方面的正式证据,但我强烈怀疑正则表达式的语言本身不是常规的,因此不受正则表达式¹的约束。这将使正确的正则表达式代表它是不可能的。

为什么呢?好吧,可以证明需要平衡括号的语言,例如Lisp(或more famously,HTML)is not regular using the pumping lemma

  

证明平衡(即,正确嵌套)括号的语言不规则的证据遵循相同的想法。给定 p ,有一串平衡括号,以 p 左括号开头,因此 y 将完全由左括号组成。通过重复 y ,我们可以生成一个不包含相同数量的左括号和右括号的字符串,因此它们无法平衡。

正则表达式permit nested capture groups,似乎属于这一类:

  

以上一课为例,如果我们想要捕获图像文件编号和文件名,我可以编写表达式^(IMG(\d+))\.png$

无论如何,对于the Computer Science Stack Exchange site来说,这可能是一个更好的问题。

修改

¹tomp指出基于PCRE的正则表达式引擎(可能还有其他人)are actually able to match all context-free grammars and at least some context-sensitive grammars!这代表了表达能力的大量差异。假设文章是正确的,非常酷!

(当然,这些扩展的实现是否仍然是“正则表达式”还有争议。由于我们在编程网站上,我会采取他们的立场。在CS网站上我可能会采取相反的位置!)

因此,在技术上可以将正则表达式表示为正则表达式。

即便如此,编写代表所有正则表达式的正则表达式的任务也非常复杂。考虑比较验证电子邮件地址的任务。许多资源将其归结为类似于[^@]+@[^@]+的东西,或者“只要符号中只有一个,之前至少有一个字符,然后是一个字符,我们就会很好”。

但看看这显然complete regex to validate RFC 822。这是对的吗?谁知道。我当然不打算检查它。

看过这个,我不想尝试写一个正则表达式来验证正则表达式。

答案 1 :(得分:2)

我只是在几分钟内编写了这个,所以不要期望太多......但是,它可以匹配字符串中的正则表达式。

^([igsmx]{1,})?\/(?=.*?(\\w|\\d|\[.*?\]|\(.*?\))).*?\/([igsmx]{1,})?$

它可以扩展,looooooot ......