我有一堆perl /questions/tagged/perl regexp /questions/tagged/regexps 在脚本中。我想知道其中有多少个捕获组。更准确地说,我想知道在真正的匹配操作中实际使用它们之前,如果 @- 和 @+ 数组匹配,将添加多少个项目。
一个例子:
'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";
Output:
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 个捕获组regexp /questions/tagged/regexp。但也许有一种更简单的方法,但这绝对不完整(例如,这对待(?<foo>...)
and (?'foo'...)
作为非捕获组)。
另一种方法是转储内部数据结构regcomp
功能。也许是包裹正则表达式::调试器 http://search.cpan.org/~dconway/Regexp-Debugger-0.001022/lib/Regexp/Debugger.pm可以解决问题,但我无权在我的环境中安装软件包。
实际上regexp /questions/tagged/regexps 是一些 ARRAY 引用的键,我想在实际应用之前检查引用的 ARRAY 是否包含适当数量的值regexp /questions/tagged/regexps。当然,这种检查可以在模式匹配之后立即完成,但如果我可以在脚本的加载阶段完成它,那就更好了。
提前感谢您的帮助和评论!