Regex 正则表达式中的反向引用匹配,但不捕获

Regex 正则表达式中的反向引用匹配,但不捕获,regex,raku,Regex,Raku,这个节目 say "zipi zape" ~~ /(\w)\w» \s+ \w+({$0})/; 返回 「pi zape」 0 => 「p」 1 => 「」 我将其解释为第一个匹配与零宽度匹配的反向引用?可能是因为它与$0匹配,而$0在正则表达式之外被逐项列为“”?如何使用这些反向引用,同时捕获匹配? 注:这与相关,需要澄清反向引用的使用。根据: 如果需要从另一个捕获中引用捕获,请先将其存储在变量中 因此,您可以使用: say "zipi zape" ~~ /(\w){} :

这个节目

say "zipi zape" ~~ /(\w)\w» \s+ \w+({$0})/;
返回

「pi zape」
 0 => 「p」
 1 => 「」
我将其解释为第一个匹配与零宽度匹配的反向引用?可能是因为它与$0匹配,而$0在正则表达式之外被逐项列为“”?如何使用这些反向引用,同时捕获匹配? :这与相关,需要澄清反向引用的使用。

根据:

如果需要从另一个捕获中引用捕获,请先将其存储在变量中

因此,您可以使用:

say "zipi zape" ~~ /(\w){} :my $c = $0; \w » \s+ \w+($c)/;
输出

「pi zap」
 0 => 「p」
 1 => 「p」

{$0}
不是反向引用。
它是一个代码块。
在这种情况下,它是一个完全不起任何作用的代码块

为了将其实际用作正则表达式的一部分,它需要
围绕它


事实上,由于
()
表示与
$/
相关的新闭包,因此如果它实际用于某个对象,则它将是一个空正则表达式。
$/
对于每个
()
都会重置,因此
$0
也会重置。)

说“zipi zape”~~~/(\w)\w»\s+\w+()/;
无法解析调用方插值_断言(匹配:D:Nil:U,BOOTInt,BOOTInt,BOOTInt,BOOTInt,PseudoStash:D);这些签名都不匹配:
(匹配:关联:D,$,$,$,$,$,$,*%)
(匹配:Iterable:D\var,int\im,int\monkey,int\s,$,\context,*%\ux)
(匹配:Mu:D\var,int\im,int\monkey,$,$,\context,*%\ux)
在1号线的街区
这是因为它与
()
基本相同


您可以使用
{}
在第二个
()
之前更新
$/
,并在
$0
周围使用双引号

说“zipi zape”~~/(\w){}\w»\s+\w+(“$0”)/;
皮扎普
0=>(p)
1=>(p)
对我来说,这似乎有点不可靠。
(它依赖于我所认为的一个MIS特征,如果不是一个彻底的错误。)< /P>
这就是Håkon Hægland将其存储在词汇变量中的答案。
(使用
{}
更新
$/
后)

说“zipi zape”~~/(\w){}:我的$c=$0\w»\s+\w+($c)/;
词法变量的作用域不限于
()
,因此这样做是完全安全的

我个人会将
$0
字符串化,因为这是
$0
中正在使用的匹配对象的唯一部分

说“zipi zape”~~/(\w){}:my$c=~$0\w»\s+\w+($c)/;

老实说,我看不出有什么理由去捕捉第二场比赛,因为它总是和第一场比赛一样

说“zipi zape”~~/(\w)\w»\s+\w+$0/;
我也认为添加
>>
没有什么意义,因为
\s+
已经强制它成为一个单词的结尾

说“zipi zape”~~/(\w)\w\s+\w+$0/;

实际上,我想了解上述行为。但还有一件事我有点不明白;为什么要在第一次捕获后使用大括号和大括号?似乎只在a中提到了
{}
的这种用法:它说我们需要它来更新当前的匹配对象。Hi@Jjmerlo“我想了解上述行为。”简言之,
(…)
是创建一个新的
匹配
对象并将
$/
设置为paren中的新对象的缩写。因此,您的第二对paren意味着它们内部的
$0
并不是指(从第一对paren中捕获的)第一对paren。@jjmerlo“为什么在第一次捕获后使用大括号和大括号”我在之前的SOs中已经解释过这一点(概括和深入);请参阅我对您问题的评论作为起点。@raiph感谢您对另一个问题的引用!在撰写本文时,您的原始问题和您对Håkon答案的评论中提出的所有问题都在中进行了详细解释。你认为你的问题和疑问值得一试吗?如果你读了我的链接答案,认为你的答案不一样,我会很乐意写一个答案,但现在我认为它基本上是重复的。