Raku递归正则表达式语法和所有匹配变量是什么,以及它们在尝试中的作用。
'hellohelloworldworld' ~~ m{ ^(h\w+?o) (?0) world };
say "\n=$&"
似乎不起作用。
请帮助解决这些问题。
'hellohelloworldworld' ~~ m{ ^(h\w+?o) (?0) world };
say "\n=$&"
似乎不起作用。
请帮助解决这些问题。
<~~>
。'hellohelloworldworld' ~~ m{ ^(h\w+?o) <~~>? world };
say $/; # OUTPUT: «「hellohelloworld」
# 0 => 「hellohello」»
<~~>
这个符号,代码 say $/ if 'hellohelloworldworld' ~~ m{ ^(h\w+?o) world };
仍然返回相同的结果。我使用的 REPL 版本是 moar (2021.06)
。 - jubilatious1我预期看到的两个答案已经发布了,它们是:
{}
出版物" (技术上称为反向引用): > say $/ if 'hellohelloworldworld' ~~ m/ ^(h\w+?o) {} $0 world /;
「hellohelloworld」
0 => 「hello」
> say $/ if 'hellohelloworldworld' ~~ m/ ^(h\w+?o) world /;
「hellohelloworld」
0 => 「hellohello」
其次,可以在正则表达式内使用Raku专用的“<~~>
递归匹配”运算符。
然而,在真正的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」)
>
: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语言为解决问题提供了许多不同的方式,这是该语言的一个优点。
say $/ if 'hellohelloworldoworld' ~~ m/ ^(h\w+?o) {$0} world /;
可以得到期望的答案。我正在运行 REPL 版本moar (2021.06)
。 - jubilatious1worldoworld
)。现在我明白了:say $/ if 'hellohelloworldworld' ~~ m/ ^(h\w+?o) {} $0 world /;
可以正常工作。我的测试表明,“发布”确实仍然是必需的。 - jubilatious1