是否可以用另一个正则表达式检测一个有效的正则表达式?如果是这样,请给出下面的示例代码。
当前回答
不,如果你严格地说正则表达式,而不包括一些实际上是上下文无关语法的正则表达式实现。
正则表达式有一个限制,即不可能编写匹配所有且仅匹配正则表达式的正则表达式。不能匹配已配对的括号等实现。正则表达式使用许多这样的结构,让我们以[]为例。只要有[就必须有匹配],这对于正则表达式"\[.*\]"来说很简单。
正则表达式不可能实现的原因是它们可以被嵌套。如何编写匹配嵌套括号的正则表达式?答案是没有一个无限长的正则表达式就不能。你可以通过蛮力匹配任意数量的嵌套括号,但你永远不能匹配任意长的嵌套括号集。
此功能通常称为计数,因为您正在计数嵌套的深度。正则表达式根据定义不具备计数的能力。
最后我写了一篇关于正则表达式限制的文章。
其他回答
你可以将regex提交给preg_match,如果regex无效,preg_match将返回false。不要忘记使用@来抑制错误消息:
@preg_match($regexToTest, '');
如果正则表达式为//,则返回1。 如果正则表达式没问题,将返回0。 否则将返回false。
不,如果你严格地说正则表达式,而不包括一些实际上是上下文无关语法的正则表达式实现。
正则表达式有一个限制,即不可能编写匹配所有且仅匹配正则表达式的正则表达式。不能匹配已配对的括号等实现。正则表达式使用许多这样的结构,让我们以[]为例。只要有[就必须有匹配],这对于正则表达式"\[.*\]"来说很简单。
正则表达式不可能实现的原因是它们可以被嵌套。如何编写匹配嵌套括号的正则表达式?答案是没有一个无限长的正则表达式就不能。你可以通过蛮力匹配任意数量的嵌套括号,但你永远不能匹配任意长的嵌套括号集。
此功能通常称为计数,因为您正在计数嵌套的深度。正则表达式根据定义不具备计数的能力。
最后我写了一篇关于正则表达式限制的文章。
好问题。
真正的规则语言不能任意地决定嵌套良好的圆括号。如果你的字母表中包含'('和')',目标是判断这些字符串是否有格式良好的匹配圆括号。因为这是正则表达式的必要要求,所以答案是否定的。
但是,如果您放宽要求并添加递归,您可能就可以做到这一点。原因是递归可以作为一个堆栈,让您通过推入这个堆栈来“计算”当前嵌套深度。
Russ Cox写了“正则表达式匹配可以简单而快速”,这是一篇关于正则表达式引擎实现的精彩论文。
不,如果你使用标准正则表达式。
原因是您不能满足常规语言的抽运引理。抽吸引理指出,属于语言“L”的字符串是正则的,如果存在一个数字“N”,使得将字符串分为三个子字符串x, y, z,使得|x|>=1 && |xy|<=N,你可以重复y多次,而整个字符串仍然属于L。
抽运引理的一个结果是,你不能有A ^Nb^Mc^N这样的正则字符串,也就是说,两个相同长度的子字符串被另一个字符串隔开。无论你以何种方式将这些字符串分割成x、y和z,你都不能在不获得“a”和“c”数量不同的字符串的情况下“抽取”y,从而保留原始语言。例如,正则表达式中的圆括号就是这种情况。
有了这个版本,你可以用php检查一个字符串的regex -我从上面的例子,并修改了一点:
$re = '/((?:(?:[^?+*{}()[\]\\\\|]+|\\\\.|\[(?:\^?\\\\.|\^[^\\\\]|[^\\\\^])(?:[^\]\\\\]+|\\\\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>)??\)|\(\?(?:R|[+-]?\d+)\))(?:(?:[?+*]|\{\d*(?:,\d*)?\})[?+]?)?|\|)*)/';
$str = '[0-9]{1,}[a-z]';
preg_match($re, $str, $matches, PREG_OFFSET_CAPTURE, 0);
$length = strlen($str);
$length2 = strlen($matches[0][0]);
if($length == $length2) {
echo "is regex";
} else {
echo "is no regex";
}
推荐文章
- 如何从JavaScript中使用正则表达式的字符串中剥离所有标点符号?
- 正则表达式中的单词边界是什么?
- 如何将一个标题转换为jQuery的URL段塞?
- Javascript和regex:分割字符串并保留分隔符
- (grep)正则表达式匹配非ascii字符?
- 如何在保持原始字符串的同时对字符串执行Perl替换?
- 创建正则表达式匹配数组
- *的区别是什么?和。*正则表达式?
- 如何将“camelCase”转换为“Camel Case”?
- 在Java中使用正则表达式提取值
- Java中的正则表达式命名组
- 使用正则表达式搜索和替换Visual Studio代码
- 使用split("|")按管道符号拆分Java字符串
- 替换字符串中第一次出现的模式
- “\d”在正则表达式中是数字吗?