是否可以用另一个正则表达式检测有效的正则表达式?如果是,请在下面给出示例代码
/
^#字符串开头
(#第一组开始
(?:
(?:[^?+*{}()[\]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$
|\\.\\转义字符
|\[(?:\^?\.\^[^\\].[^\\^])字符类
(?: [^\]\\]+ | \\. )* \]
|\((?:\?[:=!]\124;\?<;[=!]\124;\?>;)(?:\?\)括号,带递归内容
|\(\?(?:R |[+-]?\d+)\递归匹配
)
(?:(?:[?+*]| \{\d+(?:,\d*)?\})[?+]?)?#量词
|\\\\备选方案
)*#重复内容
)#结束第一组
$#字符串末尾
/
这是一个递归正则表达式,许多正则表达式引擎不支持它。基于PCRE的系统应该支持它
没有空格和注释:
<前期<前期<前期<<前期<<<前期<<<<前期<<<<<前期<<<<<前期<<<<<前期<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<})[?+]?)?\\)*)$/
.NET不直接支持递归。((?1)和(?R)构造)递归必须转换为计数平衡组:
^#字符串的开头
(?:
(?:[^?+*{}()[\]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$
|\\.\\转义字符
|\[(?:\^?\.\^[^\\].[^\\^])字符类
(?: [^\]\\]+ | \\. )* \]
| \( (?:\?[:=!]
|\?<;[=!]
|\?>;
|\?<;[^\W\d]\W*>;
|\?'[^\W\d]\W*'
)?#集团开业
(?<;N>;)#增量计数器
|\)\集团关闭
(?<;-N>;)#减量计数器
)
(?:(?:[?+*]| \{\d+(?:,\d*)?\})[?+]?)?#量词
|\\\\备选方案
)*#重复内容
$#字符串末尾
(?(N)(?!)#如果计数器非零,则失败。
压实:
<前期<<前期<<前期<<前期<<前期<<前期<<前期<<<前期<<前期<<<前期<<前期<<前期<<<前期<<<前期<<前期<<<<前期<<<<<<<<<<<<<<<前期<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:(?:[?+*]\{\d+(?:,\d*)?\})[?+]?)*$(?(N)(?!)
从评论中:
这会验证替换和翻译吗
它将只验证替换和转换的正则表达式部分s/<;本部分>;//
理论上不可能将所有有效的正则表达式语法与正则表达式匹配
如果正则表达式引擎支持递归(如PCRE),那么这是可能的,但这不能再称为正则表达式了
实际上,“递归正则表达式”不是正则表达式。但这是一个经常被接受的对正则表达式引擎的扩展。。。讽刺的是,这个扩展正则表达式与扩展正则表达式不匹配
“在理论上,理论和实践是一样的。在实践中,它们不是。”几乎所有知道正则表达式的人都知道正则表达式不支持递归。但是PCRE和大多数其他实现所支持的远远不止是基本的正则表达式
在grep命令中与shell脚本一起使用,它显示了一些错误。。grep:{}的内容无效。我正在制作一个脚本,可以grep一个代码库来查找所有包含正则表达式的文件
此模式利用了一个名为递归正则表达式的扩展。这是不受POSIX风格的正则表达式支持的。您可以尝试使用-P开关来启用PCRE正则表达式
正则表达式本身“不是正则语言,因此无法由正则表达式解析…”
经典正则表达式也是如此。一些现代的实现允许递归,这使得它成为一种上下文无关的语言,尽管这项任务有点冗长
我知道您在哪里匹配了
[]()/\。和其他特殊的正则表达式字符。在哪里允许使用非特殊字符?似乎这将匹配^(?:[\.]+)$,但不匹配^abcdefg$。这是一个有效的正则表达式
[^?+*{}()[\]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]将匹配任何单个字符,而不是任何其他构造的一部分。这包括文字(a–z)和某些特殊字符(^,$,)