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答案的评论中提出的所有问题都在中进行了详细解释。你认为你的问题和疑问值得一试吗?如果你读了我的链接答案,认为你的答案不一样,我会很乐意写一个答案,但现在我认为它基本上是重复的。