Raku 正则表达式:如何在先行中使用捕获组

Raku regex: How to use capturing group inside lookaheads

如何在先行断言中使用捕获组?

此代码:

say "ab" ~~ m/(a) <?before (b) > /;

returns:

「a」
 0 => 「a」

但我还希望捕获 'b'。

有办法吗?

我不想将 'b' 留在前瞻之外,因为我不想让 'b' 成为匹配的一部分。

有没有办法捕获 'b' 但仍将其留在比赛之外?

注意:

我尝试使用 Raku 的捕获标记,如:

say "ab" ~~ m/<((a))> (b) /;

「a」
 0 => 「a」
 1 => 「b」

但这似乎并没有像我预期的那样工作,因为即使 'b' 留在匹配项之外,正则表达式也已 处理 'b'。而且我也不想被处理

例如:

say 'abab' ~~ m:g/(a)<?before b>|b/;

(「a」
    0 => 「a」
 「b」 
 「a」
    0 => 「a」
 「b」)

# Four matches (what I want)
 

say 'abab' ~~ m:g/<((a))>b|b/;

(「a」
    0 => 「a」 
 「a」
    0 => 「a」)

# Two matches

Is there a way to do so?

不是真的,而是有点。在我们试图实现这一目标的过程中,有三件事对我们不利。

  1. Raku 正则表达式捕获匹配树的形式。因此 (a(b)) 导致一个位置捕获包含另一个位置捕获。我为什么要提到这个?因为像 before 这样的事情也在发生同样的事情,它以正则表达式作为参数:传递给 before 的正则表达式得到它自己的 Match 对象。
  2. ? 表示“不捕获”。我们可能会考虑删除它以获得 <before (b)>,现在 Match 对象中确实有一个 before 键,这听起来很有希望,除了...
  3. before 实际上并不 return 它在内部匹配的内容,而是一个零宽度的 Match 对象,否则如果我们确实忘记了 ?我们最终会认为它不是前瞻性的。

要是我们能从前瞻内部拯救 Match 对象就好了。好吧,我们可以!我们可以声明一个变量,然后将 before 参数正则表达式中的 $/ 绑定到其中:

say "ab" ~~ m/(a) :my $lookahead; <?before b {$lookahead = $/}> /;
say $lookahead;

给出:

「a」
 0 => 「a」
「b」

有效,但很遗憾,它不像正常捕获那样附加。没有办法做到这一点,尽管我们可以通过 make:

附加它
say "ab" ~~ m/(a) :my $lookahead; <?before (b) {$lookahead = [=12=]}> { make $lookahead } /;
say $/.made;

使用相同的输出,除了现在它会可靠地附加到从 m:g 返回的每个匹配对象,因此即使不漂亮也会很健壮。