当前位置:  开发笔记 > 编程语言 > 正文

如何检测Perl Regexp中有多少个捕获组?

如何解决《如何检测PerlRegexp中有多少个捕获组?》经验,为你挑选了0个好方法。

我在脚本中有一堆perl regexp.我想知道它们中有多少个捕获组.更准确地说,我想知道在@ - 和@ +数组中添加了多少项,如果它们匹配之前实际在真正的匹配操作中使用它们.

一个例子:

'XXAB(CD)DE\FG\XX' =~ /(?i)x(ab)\(cd\)(?:de)\\(fg\\)x/
    and print "'@-', '@+'\n";

在这种情况下,输出是:

'1 2 11', '15 4 14'

所以匹配后我知道第0项是字符串的匹配部分,并且有两个捕获组表达式.在实际比赛之前是否可以知道?

我试着把注意力集中在开口支架上.所以我首先删除了'\\'模式,以便更容易检测到转义的括号.然后我删除了'\('字符串.然后来了'(?'.现在我可以计算剩余的开括号.

my $re = '(?i)x(ab)\(cd\)(?:de)\\\\(fg\\\\)x'; print "ORIG: '$re'\n";
'XXAB(CD)DE\FG\XX' =~ /$re/ and print "RE: '@-', '@+'\n";
$re =~ s/\\\\//g; print "\\\\: '$re'\n";
$re =~ s/\\\(//g; print "\\(: '$re'\n";
$re =~ s/\(\?//g; print "\\?: '$re'\n";
my $n = ($re =~ s/\(//g); print "n=$n\n";

输出:

ORIG: '(?i)x(ab)\(cd\)(?:de)\\(fg\\)x'
RE: '1 2 11', '15 4 14'
\\: '(?i)x(ab)\(cd\)(?:de)(fg)x'
\(: '(?i)x(ab)cd\)(?:de)(fg)x'
\?: 'i)x(ab)cd\):de)(fg)x'
n=2

所以我知道这个正则表达式中有2个捕获组.但也许有一种更简单的方法,这绝对不是完整的(例如,这种对待(?...)(?'foo'...)作为非caputre组).

另一种方法是转储regcomp函数的内部数据结构.也许包Regexp :: Debugger可以解决这个问题,但我无权在我的环境中安装软件包.

实际上正则表达式是某些ARRAY引用的键,我想在实际应用正则表达式之前检查引用的ARRAY是否包含适当数量的值.当然,这种检查可以在模式匹配之后立即完成,但如果我可以在脚本的加载阶段进行检查则更好.

感谢您的帮助和评论!

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有