是否可以编写与正则表达式匹配的正则表达式?有没有人有例子?如果存在一些理论障碍,是否有人知道至少与最常见的正则表达式相匹配的正则表达式?
答案 0 :(得分:17)
正则表达式不是常规语言,因此无法用正则表达式来描述!
更新:更有用的实用答案
您无法使用任何正则表达式检测有效的正则表达式。要检测其有效性,您应该使用正则表达式库解析字符串,如果它是无效的正则表达式,它将失败。例如,在Java中,它将类似于:
boolean isValidRegexp(String s) {
try {
Pattern.compile(s);
return true;
} catch (Exception e) {
return false;
}
}
这种技术几乎适用于任何语言。
答案 1 :(得分:8)
你错了!在我的秘密实验室,我的邪恶科学家发现了可以匹配任何正则表达式的正则表达式:
.*
它甚至会匹配null表达式。让我们看看你试着匹配那个!
作为一个额外的好处,它甚至会匹配不是正则表达式的字符串。
答案 2 :(得分:2)
使用标准正则表达式是不可能的。
正则表达式可以无限期嵌套(例如,/(a(b(c(d))))/
),使用标准正则表达式无法匹配。
答案 3 :(得分:1)
根据Crockford,这是一个匹配正则表达式的正则表达式(至少在JavaScript中)
/\/(\\[^\x00-\x1f]|\[(\\[^\x00-\x1f]|[^\x00-\x1f\\\/])*\]|[^\x00-\x1f\\\/\[])+\/[gim]*/
答案 4 :(得分:0)
是。示例:此正则表达式^[a-z][+*]$
将匹配此正则表达式z+
以及此a*
和此c+
,依此类推。
答案 5 :(得分:0)
这是不可能的。正则表达式只能匹配常规语言。正则表达式不是常规语言。如果内存服务,我相信它们是一种无上下文的语言,需要无上下文语法才能匹配。
答案 6 :(得分:0)
我们走了:
m{/([^\\/]++|\\.)/}
应匹配由//
分隔的正则表达式。
当然,它不能确保正则表达式正确解析 - 它只是识别它的位置(例如,对于标记化器)。