有没有人试图描述与正则表达式匹配的正则表达式?
由于重复的关键字,几乎无法在网络上找到此主题。
它可能在实际应用程序中无法使用,因为支持正则表达式的语言通常有一个解析它们的方法,我们可以用它来进行验证,以及一种在代码中分隔正则表达式的方法,可以使用用于搜索目的。
但我仍然想知道匹配所有正则表达式的正则表达式是怎样的。应该可以写一个。
答案 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 ......