是否存在用于检测有效正则表达式的正则表达式?

是否可以用另一个正则表达式检测有效的正则表达式?如果是,请在下面给出示例代码

/
^#字符串开头
(#第一组开始
(?:
(?:[^?+*{}()[\]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$
|\\.\\转义字符
|\[(?:\^?\.\^[^\\].[^\\^])字符类
(?: [^\]\\]+ | \\. )* \]
|\((?:\?[:=!]\124;\?<[=!]\124;\?>)(?:\?\)括号,带递归内容
|\(\?(?:R |[+-]?\d+)\递归匹配
)
(?:(?:[?+*]| \{\d+(?:,\d*)?\})[?+]?)?#量词
|\\\\备选方案
)*#重复内容
)#结束第一组
$#字符串末尾
/

这是一个递归正则表达式,许多正则表达式引擎不支持它。基于PCRE的系统应该支持它

没有空格和注释:

<前期<前期<前期<<前期<<<前期<<<<前期<<<<<前期<<<<<前期<<<<<前期<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<})[?+]?)?\\)*)$/


.NET不直接支持递归。((?1)(?R)构造)递归必须转换为计数平衡组:

^#字符串的开头
(?:
(?:[^?+*{}()[\]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$
|\\.\\转义字符
|\[(?:\^?\.\^[^\\].[^\\^])字符类
(?: [^\]\\]+ | \\. )* \]
| \( (?:\?[:=!]
|\?&lt;[=!]
|\?&gt;
|\?&lt;[^\W\d]\W*&gt;
|\?'[^\W\d]\W*'
)?#集团开业
(?&lt;N&gt;)#增量计数器
|\)\集团关闭
(?&lt;-N&gt;)#减量计数器
)
(?:(?:[?+*]| \{\d+(?:,\d*)?\})[?+]?)?#量词
|\\\\备选方案
)*#重复内容
$#字符串末尾
(?(N)(?!)#如果计数器非零,则失败。

压实:

<前期<<前期<<前期<<前期<<前期<<前期<<前期<<<前期<<前期<<<前期<<前期<<前期<<<前期<<<前期<<前期<<<<前期<<<<<<<<<<<<<<<前期<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:(?:[?+*]\{\d+(?:,\d*)?\})[?+]?)*$(?(N)(?!)

从评论中:

这会验证替换和翻译吗

它将只验证替换和转换的正则表达式部分s/&lt;本部分&gt;//

理论上不可能将所有有效的正则表达式语法与正则表达式匹配

如果正则表达式引擎支持递归(如PCRE),那么这是可能的,但这不能再称为正则表达式了

实际上,“递归正则表达式”不是正则表达式。但这是一个经常被接受的对正则表达式引擎的扩展。。。讽刺的是,这个扩展正则表达式与扩展正则表达式不匹配

“在理论上,理论和实践是一样的。在实践中,它们不是。”几乎所有知道正则表达式的人都知道正则表达式不支持递归。但是PCRE和大多数其他实现所支持的远远不止是基本的正则表达式

在grep命令中与shell脚本一起使用,它显示了一些错误。。grep:{}的内容无效。我正在制作一个脚本,可以grep一个代码库来查找所有包含正则表达式的文件

此模式利用了一个名为递归正则表达式的扩展。这是不受POSIX风格的正则表达式支持的。您可以尝试使用-P开关来启用PCRE正则表达式

正则表达式本身“不是正则语言,因此无法由正则表达式解析…”

经典正则表达式也是如此。一些现代的实现允许递归,这使得它成为一种上下文无关的语言,尽管这项任务有点冗长

我知道您在哪里匹配了[]()/\。和其他特殊的正则表达式字符。在哪里允许使用非特殊字符?似乎这将匹配^(?:[\.]+)$,但不匹配^abcdefg$。这是一个有效的正则表达式

[^?+*{}()[\]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]将匹配任何单个字符,而不是任何其他构造的一部分。这包括文字(az)和某些特殊字符(^$

发表评论