Raku正则表达式:如何在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中使用捕获组?
回答
当您在实际捕获之前引用捕获的值时,它不会被初始化,因此您无法获得匹配项。在实际使用对捕获值的反向引用之前,您需要定义捕获组。
接下来,您需要定义一个代码块并将反向引用分配给要在整个 regex 模式中使用的变量,否则,它对后视模式不可见。请参阅此捕获乐参考:
此代码块在正则表达式中发布捕获,以便将其分配给其他变量或用于后续匹配
你可以使用类似的东西
say "133" ~~ m/ (d) {} :my $c=$0; <?after $c ** 2> $ /;
这里,(d)匹配并捕获一个数字,然后使用一个代码块将这个捕获的值分配给一个$c变量,然后<?after $c ** 2>lookbehind检查该$c值是否在当前位置的左侧至少出现两次,然后$锚检查是否当前位置是字符串的结尾。
请参阅此在线 Raku 演示。