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

时间:2017-11-21 22:05:47

标签: perl6

应该很简单,但我无法应对。

我希望将<a href = "#" onclick = "DisplayDocument('1-Disposition-4-Generate Single Letter.htm')" href = "#">Disposition-Generate Single Letter</a>的{​​{1}}与a完全匹配。那么,以下

b

应该产生:

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

UPD:以下变体不起作用,可能是因为@smls's answer中提到的aaabbb aabb ab 错误(但更可能是因为我犯了一些错误? ):

:ex

> my $input = "aaabbbb"; > .put for $input ~~ m:ex/ (a) * (b) * <?{ +$0 == +$1 }> /; Nil > .put for $input ~~ m:ex/ (a) + (b) + <?{+$0 == +$1}> /; Nil :ov适用于:

?

UPD2:以下解决方案也适用于> my $input = "aaabbbb"; > .put for $input ~~ m:ov/ (a)+ (b)+? <?{+$0 == +$1}> /; aaabbb aabb ab ,但我必须在没有:ex断言的情况下进行此操作。

<?...>

2 个答案:

答案 0 :(得分:8)

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

输出:

aaabbb
aabb
ab

它应该与:ex而不是:ov一起使用 - 但Rakudo bug #130711目前可以阻止它。

答案 1 :(得分:5)

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> /;