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

Eug*_*sky 3 perl6

应该很简单,但我无法应付它.

我想匹配与as 完全相同的bs数.所以,以下

my $input = 'aaabbbb';
$input ~~ m:ex/ ... /;
Run Code Online (Sandbox Code Playgroud)

应该产生:

aaabbb
aabb
ab
Run Code Online (Sandbox Code Playgroud)

UPD:以下变种不起作用,可能是因为@ smls的答案中:ex提到的bug (但更可能是因为我犯了一些错误?):

> my $input = "aaabbbb";
> .put for $input ~~ m:ex/ (a) * (b) * <?{ +$0 == +$1 }> /;
Nil
> .put for $input ~~ m:ex/ (a) + (b) + <?{+$0 == +$1}> /;
Nil
Run Code Online (Sandbox Code Playgroud)

这个,:ov?,工作:

> my $input = "aaabbbb";
> .put for $input ~~ m:ov/ (a)+ (b)+? <?{+$0 == +$1}> /;
aaabbb
aabb
ab
Run Code Online (Sandbox Code Playgroud)

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

> $input = 'aaabbbb'
> $input ~~ m:ex/ (a) + (b) + { put $/ if +$0 == +$1 } /;
aaabbb
aabb
ab
Run Code Online (Sandbox Code Playgroud)

sml*_*mls 8

my $input = "aaabbbb";
say .Str for $input ~~ m:ov/ (a)+  b ** {+$0} /;
Run Code Online (Sandbox Code Playgroud)

输出:

aaabbb
aabb
ab
Run Code Online (Sandbox Code Playgroud)

它应该与之合作:ex而不是:ov- 但是Rakudo bug#130711目前可以防止这种情况发生.


wam*_*mba 5

my $input = "aaabbbb";
say .Str for $input ~~ m:ov/ a <~~>?  b  /;
Run Code Online (Sandbox Code Playgroud)

与工作ex

my $input = "aaabbbb";
say .Str for $input ~~ m:ex/ a <~~>?  b  /;
Run Code Online (Sandbox Code Playgroud)

更新:解释

<~~>意味着递归地称自己为Extensible metasyntax.(尚未完全实施.)

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

  my $input = "aaabbbb";
  my token anbn { a <&anbn>? b} 
  say .Str for $input ~~ m:ex/ <&anbn> /;
Run Code Online (Sandbox Code Playgroud)