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

时间:2019-07-07 07:22:04

标签: regex perl6

该程序

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

返回

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

我将哪一个解释为对匹配零宽度匹配的第一个匹配的反向引用?也许是因为它与$ 0相匹配,而$ 0在正则表达式之外被逐项列出了?如何使用这些反向引用并同时捕获匹配? 注意:这与this documentation issue有关,需要澄清使用反向引用的情况。

2 个答案:

答案 0 :(得分:4)

根据https://support.google.com/datastudio/answer/7088031

  

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

因此您可以使用:

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

输出

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

答案 1 :(得分:3)

{$0}不是反向引用。
这是一个代码块。
在这种情况下,它是一个绝对不执行任何操作的代码块。

要使其真正用作正则表达式的一部分,它需要<>围绕它。


实际上,由于()表示类似于$/的新闭包,因此如果它实际上用于某件事,则它将是一个空正则表达式。
$/每重置一次(),因此$0也重置。)

say "zipi zape" ~~ /(\w)\w» \s+ \w+(<{$0}>)/;
Cannot resolve caller INTERPOLATE_ASSERTION(Match:D: Nil:U, BOOTInt, BOOTInt, BOOTInt, BOOTInt, PseudoStash:D); none of these signatures match:
    (Match: Associative:D, $, $, $, $, $, *%_)
    (Match: Iterable:D \var, int \im, int \monkey, int \s, $, \context, *%_)
    (Match: Mu:D \var, int \im, int \monkey, $, $, \context, *%_)
  in block <unit> at <unknown file> line 1

之所以会这样,是因为它与(<{Nil}>)基本相同。


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

say "zipi zape" ~~ /(\w){}\w» \s+ \w+("$0")/;
「pi zap」
 0 => 「p」
 1 => 「p」

对我来说,这似乎有点不可靠。
(这取决于我认为是错误功能,即使不是彻底的错误。)


这是我们获取HåkonHægland将其存储在词汇变量中的答案。
(在使用$/更新{}之后。)

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

词法变量的作用域不限于(),因此这样做是绝对安全的。

我会亲自对$0进行字符串化,因为那是$0内部正在使用的匹配对象的唯一部分。

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

老实说,我什至没有理由赢得第二场比赛,因为它总是与第一场比赛相同。

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

添加»也没什么意义,因为\s+已经迫使它成为单词的结尾。

say "zipi zape" ~~ /(\w)\w \s+ \w+$0/;