【问题标题】:Regular expression that matches regular expressions匹配正则表达式的正则表达式
【发布时间】:2018-02-03 17:36:57
【问题描述】:

有没有人尝试过描述匹配正则表达式的正则表达式?

由于关键字重复,这个话题在网上几乎找不到。

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

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

【问题讨论】:

  • 这是一个:.* 不知道如何改进,因为 afaik 正则表达式可以按任何顺序使用任何单个字符,如果我错了,请纠正我。
  • 有趣的问题。
  • 其次(并且不那么滑稽)如果您想将正则表达式与更多内容进行匹配,您需要匹配正则表达式无法做到的括号[请参阅此处了解原因](*.com/questions/1732348/…)跨度>
  • @Barmar - 并非所有字符串都可以是正则表达式 - 想想a[[b

标签: regex


【解决方案1】:

对此我没有正式的证据,但我强烈怀疑正则表达式的语言本身不是正则,因此不受正则表达式的约束¹。这将使正确的正则表达式无法表示它。

为什么?好吧,可以证明需要平衡括号的语言,例如 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],现代正则表达式实现比仅匹配常规语言具有更大的功能。 [1]:nikic.github.io/2012/06/15/…
  • @tomp,感谢您的链接。我已经更新了我的答案以引用它。
【解决方案2】:

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

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

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

【讨论】: