如何在 Perl 6 正则表达式中匹配相同数量的不同原子?

How to match the same number of different atoms in Perl 6 regex?

应该很简单,但我应付不过来。

我想匹配与 b 相同数量的 a。所以,下面的

my $input = 'aaabbbb';
$input ~~ m:ex/ ... /;

应该产生:

aaabbb
aabb
ab

UPD: 以下变体不起作用,可能是因为 中提到的 :ex 错误(但更可能是因为我做了有些错误?):

> my $input = "aaabbbb";
> .put for $input ~~ m:ex/ (a) * (b) * <?{ +[=12=] == + }> /;
Nil
> .put for $input ~~ m:ex/ (a) + (b) + <?{+[=12=] == +}> /;
Nil

这个,:ov?,有效:

> my $input = "aaabbbb";
> .put for $input ~~ m:ov/ (a)+ (b)+? <?{+[=13=] == +}> /;
aaabbb
aabb
ab

UPD2: 以下解决方案也适用于 :ex,但我必须在没有 <?...> 断言的情况下进行。

> $input = 'aaabbbb'
> $input ~~ m:ex/ (a) + (b) + { put $/ if +[=14=] == + } /;
aaabbb
aabb
ab
my $input = "aaabbbb";
say .Str for $input ~~ m:ov/ (a)+  b ** {+[=10=]} /;

输出:

aaabbb
aabb
ab

它也应该与 :ex 一起工作,而不是 :ov,但 Rakudo bug #130711 目前阻止了它。

my $input = "aaabbbb";
say .Str for $input ~~ m:ov/ a <~~>?  b  /;

也适用于 ex

my $input = "aaabbbb";
say .Str for $input ~~ m:ex/ a <~~>?  b  /;

更新:解释

<~~>表示递归调用自己见Extensible metasyntax。 (尚未完全实施。)

以下(更长,但可能更清晰)示例也适用:

  my $input = "aaabbbb";
  my token anbn { a <&anbn>? b} 
  say .Str for $input ~~ m:ex/ <&anbn> /;