在尝试时,Raku递归正则表达式语法和Raku中的所有匹配变量是什么或如何
'hellohelloworldworld' ~~ m{ ^(hw+?o) (?0) world };
say "n=$&"
似乎不起作用
请帮忙解决这些问题。
Raku为匿名递归正则表达式提供了专用语法:<~~>
。
使用此语法,您可以将问题中的正则表达式写成:
'hellohelloworldworld' ~~ m{ ^(hw+?o) <~~>? world };
say $/; # OUTPUT: «「hellohelloworld」
# 0 => 「hellohello」»
我期望看到的两个答案已经发布,它们是:
- "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」
和,
- 使用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