什么是正确的Raku递归正则表达式语法



在尝试时,Raku递归正则表达式语法和Raku中的所有匹配变量是什么或如何

'hellohelloworldworld' ~~ m{ ^(hw+?o) (?0) world  };
say "n=$&"

似乎不起作用

请帮忙解决这些问题。

Raku为匿名递归正则表达式提供了专用语法:<~~>

使用此语法,您可以将问题中的正则表达式写成:

'hellohelloworldworld' ~~ m{ ^(hw+?o) <~~>? world  };
say $/; # OUTPUT: «「hellohelloworld」␤
#          0 => 「hellohello」␤»

我期望看到的两个答案已经发布,它们是:

  1. "CCD_ 2出版物";的匹配变量,以便稍后在相同的regex/matching操作(从技术上讲是backreference(:
> say $/ if 'hellohelloworldworld' ~~ m/ ^(hw+?o) {} $0 world /;
「hellohelloworld」
0 => 「hello」
> say $/ if 'hellohelloworldworld' ~~ m/ ^(hw+?o) world /;
「hellohelloworld」
0 => 「hellohello」

和,

  1. 使用Raku的专用";CCD_ 3递归匹配";操作人员在正则表达式中

然而,在真正的TMTOWTDI精神中,还有第三种选择,使用Raku的:nd()副词来实现某种";穷人的";递归。从['(' w* ]分组开始,可以从输入字符串(bird(in(nest)))中依次拉出「(bird」「(in」「(nest」。或者三者同时出现(最后一个例子(:

在Raku REPL:

> my $nested = "(bird(in(nest)))";
(bird(in(nest)))
> say $nested;
(bird(in(nest)))
> say  $nested ~~ m:1st/ ['(' w* ] /;
「(bird」
> say  $nested ~~ m:2nd/ ['(' w* ] /;
「(in」
> say  $nested ~~ m:3rd/ ['(' w* ] /;
「(nest」
> say  $nested ~~ m:nd(1..3)/ ['(' w* ] /;
(「(bird」 「(in」 「(nest」)
>

在幕后,这很可能是使用Raku的:position副词或:continue副词,以及Raku的$/.to匹配变量:

> say  $nested ~~ m/ ['(' w* ] /;
「(bird」
> say  $nested ~~ m:pos($/.to)/ ['(' w* ] / given $nested ~~ m/ ['(' w* ] /;
「(in」
> say  $nested ~~ m:pos($/.to)/ ['(' w* ] / given $nested ~~ (m/ ['(' w* ] / && m:pos($/.to)/ ['(' w* ] /);
「(nest」
> 

同样,Raku为您提供了许多不同的方法来处理这个问题,这是该语言的一个优点。

  • https://stackoverflow.com/a/51410261/7270649
  • https://stackoverflow.com/a/51409621/7270649
  • https://examples.perl6.org/categories/parsers/SimpleStrings.html

最新更新