如何在 Raku 中插入包含捕获组括号的字符串作为正则表达式?

gro*_*ber 11 regex regex-group raku

我想与包含许多(.*)捕获组的以编程方式构建的正则表达式进行匹配。我有这个正则表达式作为一个字符串,说

my $rx = "(.*)a(.*)b(.*)"
Run Code Online (Sandbox Code Playgroud)

我想将该字符串插入为正则表达式并与之匹配。该文档告诉我<$rx>应该做的伎俩(即插补该字符串作为一个正则表达式),但事实并非如此。比较匹配的输出(在perl6REPL 中):

> 'xaybz' ~~ rx/<$rx>/
?xaybz?
Run Code Online (Sandbox Code Playgroud)

与预期/所需输出相比,将捕获组分开:

> 'xaybz' ~~ rx/(.*)a(.*)b(.*)/
?xaybz?
 0 => ?x?
 1 => ?y?
 2 => ?z?
Run Code Online (Sandbox Code Playgroud)

注释

我可以这样做的一种不吸引人的方法是评估我的正则表达式匹配(也在 REPL 中):

> use MONKEY; EVAL "'xaybz' ~~ rx/$rx/";
?xaybz?
 0 => ?x?
 1 => ?y?
 2 => ?z?
Run Code Online (Sandbox Code Playgroud)

因此,虽然这确实给了我一个解决方案,但我确信我缺少一个字符串插值技巧,它可以避免依赖EVAL..

jjm*_*elo 10

进行匹配的结果是在正则表达式之外进行匹配。这将起作用:

my $rx = '(.*)a(.*)b(.*)';
'xaybz' ~~ rx/$<result>=<$rx>/;
say $<result>;
# OUTPUT: «?xaybz?? 0 => ?x?? 1 => ?y?? 2 => ?z??»
Run Code Online (Sandbox Code Playgroud)

因为,通过分配给 Match 变量,您正在访问原始 Match,然后您可以打印它。问题是 <$rx> 实际上是一个匹配项,而不是一个字符串。所以你正在做的是一个匹配匹配的正则表达式。可能 Match 被字符串化,然后匹配。哪个是我最接近解释结果的


Bra*_*ert 9

问题是<…>一般情况下无法捕捉到的东西。

'xaybz' ~~ / <:Ll> <:Ll> <:Ll> /
# ?xay?
Run Code Online (Sandbox Code Playgroud)

如果后面的第一件事<是字母,他们会捕获。

my regex foo { (.*)a(.*)b(.*) }

'xaybz' ~~ / <foo> /;
# ?xaybza?
#  foo => ?xaybza?
#   0 => ?x?
#   1 => ?y?
#   2 => ?za?
Run Code Online (Sandbox Code Playgroud)

如果您使用,这也适用 <a=…>

'xaybz' ~~ / <rx=$rx> /;
# ?xaybza?
#  rx => ?xaybza?
#   0 => ?x?
#   1 => ?y?
#   2 => ?za?
Run Code Online (Sandbox Code Playgroud)

当然,您也可以在外部分配它。

'xaybz' ~~ / $<rx> = <$rx> /;
# ?xaybza?
#  rx => ?xaybza?
#   0 => ?x?
#   1 => ?y?
#   2 => ?za?

'xaybz' ~~ / $0 = <$rx> /;
# ?xaybza?
#  0 => ?xaybza?
#   0 => ?x?
#   1 => ?y?
#   2 => ?za?
Run Code Online (Sandbox Code Playgroud)

请注意,<…>是次比赛,因此$0$1$2$rx永远不会在顶层。

  • grobber:那是因为您将“R”定义为“&lt;$rx&gt;”。如果你执行 `regex R { &lt;rx=$rx&gt; }` 那么它就会起作用。需要命名的原因之一是位置捕获是在编译时计算的。如果你执行“regex R { &lt;$rx&gt; (.) }”,则将不可能知道“(.)”的数字应该是多少。命名捕获不会受到同样的限制。 (3认同)
  • “请注意,问题正在传播”。我对你选择的“问题”这个词感到震惊。事实上,只有以字母字符捕获开头的“&lt;...&gt;”断言是一个故意的功能。在你的例子中......啊,@user0721090601 已经涵盖了这一点。:) (2认同)