Raku 正则表达式:如何在后视中使用捕获组

Raku regex: How to use capturing group inside lookbehinds

如何在回顾断言中使用捕获组?

我尝试使用与此 中相同的公式。但这似乎不适用于后视。

概念上,这就是我想要做的。

say "133" ~~ m/ <?after [=10=]+> (\d) $ /

我知道这可以在没有回顾的情况下轻松实现,但暂时忽略它:)

为此,我尝试了以下选项:

使用:var语法:

say "133" ~~ m/ <?after $look-behind+> (\d):my $look-behind; $ /;
# Variable '$look-behind' is not declared

使用code block语法定义外部变量:

my $look-behind;
say "133" ~~ m/ <?after $look-behind+> (\d) {$look-behind=[=12=]} $ /;
# False

看来问题是lookbehind在“code block/:my $var”之前执行,因此lookbehind tree的变量是空的。

有没有办法在回顾中使用捕获组?

当您在实际捕获之前引用捕获的值时,它不会被初始化,因此您无法获得匹配。在实际使用对捕获值的反向引用之前,您需要定义捕获组。

接下来,您需要定义一个代码块并将反向引用分配给要在整个正则表达式模式中使用的变量,否则,它对 lookbehind 模式不可见。见 this Capturing Raku reference:

This code block publishes the capture inside the regex, so that it can be assigned to other variables or used for subsequent matches

你可以使用像

这样的东西
say "133" ~~ m/ (\d) {} :my $c=[=10=]; <?after $c ** 2> $ /;

这里,(\d)匹配并捕获一个数字,然后使用一个代码块将这个捕获的值分配给一个$c变量,然后<?after $c ** 2> lookbehind检查是否$c 值在当前位置的左侧至少出现两次,然后 $ 锚点检查当前位置是否为字符串的末尾。

this online Raku demo