如何在 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> /;
应该很简单,但我应付不过来。
我想匹配与 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> /;