regex - 为什么/如何在将重复的任意字符与捕获组匹配时需要额外的变量?

标签 regex raku

我正在使用 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/

相关文章:

Java正则表达式匹配逗号分隔的接口(interface)列表

javascript - 用于替换单个反斜杠的正则表达式,不包括后跟某些字符的反斜杠

regex - perl6 如何只在某些条件下匹配一个字符?

需要 Readline - 您不能创建这种类型的实例 (Readline)

module - 使用 zef 强制安装顺序

javascript - 通过将 replace() 与合适的正则表达式一起应用,避免将 '-' 作为用户输入

sql - 匹配所有数字直到第一个空格

javascript - 不同的拆分正则表达式导致 IE

max - perl6 混合 Str 和 Int 参数的最小值和最大值

arrays - 如何遍历 Raku 哈希中的数组?