我正在使用 perl6 正则表达式匹配具有最小长度的重复任意字符的序列。
看完https://docs.perl6.org/language/regexes#Capture_numbers并调整给出的示例,我使用“外部变量”提出了这段代码:
#uses an additional variable $c
perl6 -e '$_="bbaaaaawer"; /((.){} :my $c=$0; ($c)**2..*)/ && print $0';
#Output: aaaaa
为了帮助说明我的问题,perl5 中有一个类似的正则表达式:
#No additional variable needed
perl -e ' $_="bbaaaaawer"; /((.)\2{2,})/ && print $1';
有人能告诉我“储蓄”的需要/好处吗
$0
进入 $c
以及空{}
的要求?是否有可以匹配的替代(更好/高尔夫)perl6 正则表达式?提前致谢。
最佳答案
Perl 6 正则表达式扩展到完整的语法,从而产生解析树。那些解析树是 Match
的树。对象。每个捕获 - 命名或位置 - 要么是 Match
对象,或者,如果量化,则为 Match
的数组对象。
这通常是好的,但确实涉及到您观察到的权衡:一旦您位于嵌套捕获元素的内部,那么您将填充一个新的 Match
对象,具有自己的一组位置和命名捕获。例如,如果我们这样做:
say "abab" ~~ /((a)(b))+/
那么结果是:
「abab」
0 => 「ab」
0 => 「a」
1 => 「b」
0 => 「ab」
0 => 「a」
1 => 「b」
然后我们可以索引:
say $0; # The array of the top-level capture, which was quantified
say $0[1]; # The second Match
say $0[1][0]; # The first Match within that Match object (the (a))
它与正则表达式的传统背道而驰,但也是扩大规模以应对更大的解析挑战的重要部分。
关于regex - 为什么/如何在将重复的任意字符与捕获组匹配时需要额外的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56393888/