regex - 如何检测 Perl 正则表达式中有多少捕获组?

标签 regex perl

我有一堆 s 在脚本中。我想知道其中有多少捕获组。更准确地说,我想知道如果在实际匹配操作中实际使用它们之前匹配,将有多少项目添加到 @- 和 @+ 数组中。

一个例子:

'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>...)(?'foo'...) 视为非捕获组)。

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

其实 s 是某些 ARRAY 引用的键,我想在实际应用 之前检查引用的 ARRAY 是否包含适当数量的值s。当然,这种检查可以在模式匹配后立即进行,但如果我能在脚本的加载阶段进行检查就更好了。

提前感谢您的帮助和评论!

最佳答案

正则表达式:

\\.(*SKIP)(?!)|\((?(?=\?)\?(P?['<]\w+['>]))

解释:
\\.                     # Match any escaped character
(*SKIP)(?!)             # Discard it
|                       # OR
\(                      # Match a single `(`
(?(?=\?)                # Which if is followed by `?`
    \?                      # Match `?`
    P?['<]\w+['>]           # Next characters should be matched as ?P'name', ?<name> or ?'name'
)                       # End of conditional statement

珀尔:
my @offsets = ();
while ('XXAB(CD)DE\FG\X(X)' =~ /\\.(*SKIP)(?!)|\((?(?=\?)\?(P?['<]\w+['>]))/g){
    push @offsets, "$-[0]";
}
print join(", ", @offsets);

输出:
4, 15

这表示输入字符串中存在两个捕获组。

关于regex - 如何检测 Perl 正则表达式中有多少捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41743435/

相关文章:

perl - 只有在没有加载要求的情况下,如何运行我的 Perl 脚本?

regex - 将多个正则表达式匹配项之一分配给变量作为 Perl 单行代码(取消引用数组?)

bash - 使用 Perl 的 Bash 脚本中出现奇怪的、意外的输出

python - 正则表达式中的空格

python - 无法使正则表达式与 Python 一起使用

java - 正则表达式非选择器

JavaScript 正则表达式 - 数字之间的连字符

perl - 是否有单线才能获得拆分的第一个元素?

regex - 是否有一个 Perl 函数可以将字符串转换为正则表达式以使用该字符串作为模式?

javascript - 正则表达式更改自定义单词