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

3

有没有可能编写一个匹配正则表达式的正则表达式? 有人有例子吗? 如果存在某些理论上的障碍,是否有人知道一种至少可以匹配最常见的正则表达式模式的正则表达式?


7
问题出在哪里?.*可以很好地匹配正则表达式。 - Tim Pietzcker
7
我想我听到克苏鲁正在靠近。 - gnovice
@Tim:.*将匹配a(((,这不是正则表达式。 - Yaakov Shoham
我在我的回答中指出了这个正则表达式的特殊能力。我认为这是一个特性,而不是一个错误 :) - Carl Smotricz
3
我从未说过.*仅匹配有效的正则表达式,这也不是问题的关键,对吧? :) - Tim Pietzcker
7个回答

17

正则表达式不是常规语言,因此不能用常规表达式来描述它!

更新:更有用的实用答案

您无法使用任何正则表达式来检测有效的正则表达式。要检测其有效性,只需使用正则表达式库解析字符串,如果它是无效的正则表达式,则会失败。例如,在Java中,可能会像这样:

boolean isValidRegexp(String s) {
  try {
    Pattern.compile(s);
    return true;
  } catch (Exception e) {
    return false;
  }
}

这种技术几乎适用于任何语言。


4
尽管如此,这并不能阻止人们不断尝试。 - Mark Byers
3
我不得不想知道stackoverflow的标语是否应该是“因为正则表达式只能解析正则语言”。 - John Parker
今天的正则表达式(PCRE等)不是正则的,可以匹配非正则语言。 - Qtax
4
请不要去那里。 - Tim Pietzcker

8

你们都错了!在我的秘密实验室里,我的邪恶科学家发现了可以匹配任何正则表达式的正则表达式:

.*

它甚至可以匹配空表达式。看看你能否匹配那个

作为额外的好处,它甚至可以匹配非正则表达式的字符串。


我不敢把这个作为答案,所以我选择了胆小的评论。给你点赞! - Tim Pietzcker
我认为Jeff在某个地方鼓励我们偶尔开心一下。除了隔壁网站上的求职市场诈骗,那大概是我们努力所得到的唯一回报了。 - Carl Smotricz
有趣、机智,但并不实用。 - Tom
2
@Tom:我帮助那些有理性问题的人。既然我在这里没有得到报酬,我通过取笑那些不太明智的人来补偿自己。当然,对于那些幽默能力有问题的人,也是一样。 - Carl Smotricz
@Carl:我不明白我的问题为什么不合理。事实上,notnoop给出了一个完全合法的答案。在提问之前,我并不知道正则语言,这个问题似乎很合理。(顺便说一句,我不是在抱怨你的幽默回答,而是在抱怨你的尖刻评论) - Andrea
@Andrea:对于我称你的问题“不明智”,我深感抱歉,并收回此话。我似乎错过了你小心地询问“是否可能”的部分。 - Carl Smotricz

2

使用标准正则表达式无法实现。

正则表达式可以无限嵌套 (例如,/(a(b(c(d))))/),这是使用标准正则表达式无法匹配的。


1
根据Crockford的说法,这是一个可以匹配正则表达式(至少在JavaScript中)的正则表达式。
/\/(\\[^\x00-\x1f]|\[(\\[^\x00-\x1f]|[^\x00-\x1f\\\/])*\]|[^\x00-\x1f\\\/\[])+\/[gim]*/

0

开始吧:

m{/([^\\/]++|\\.)/}

应该匹配由//分隔的正则表达式。

当然,它并不能确保正则表达式被正确解析 - 它只是标识了它所在的位置(例如,用于令牌化器)。


1
哼,一个甚至不能匹配自己的正则表达式;我在这里并不是非常有信心。:P - Alan Moore
如果我将其重写为/\/([^\\\/]++|\\.)\//,它就可以了。如果你真的想要,我可以制作一个匹配任何m//分隔符集的工具。 - Anon.
不需要这样,我们只需要让全世界的人都像你一样重新编写他们的正则表达式以匹配你的正则表达式。顺便说一句,你需要在整个组上添加另一个量词。 - Alan Moore

0

是的。例如:这个正则表达式^[a-z][+*]$将匹配这个正则表达式z+,以及a*c+等等。


0

这是不可能的。正则表达式只能匹配正则语言。正则表达式本身并不是一个正则语言。如果我没记错的话,它们属于上下文无关语言,并需要上下文无关文法来进行匹配。


PCRE正则表达式等并不是正则表达式。 - Qtax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接