8

如何在后向断言中使用捕获组?

我尝试使用与此答案相同的公式。但这似乎不适用于lookbehinds。

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

say "133" ~~ m/ <?after $0+> (\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=$0} $ /;
# False

似乎问题在于lookbehind在“代码块/:my $var”之前执行,因此对于后视树来说变量是空的。

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

4

1 回答 1

8

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

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

此代码块在正则表达式中发布捕获,以便可以将其分配给其他变量或用于后续匹配

你可以使用类似的东西

say "133" ~~ m/ (\d) {} :my $c=$0; <?after $c ** 2> $ /;

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

请参阅此在线 Raku 演示

于 2020-12-24T12:56:25.273 回答