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

2024-02-19

如何在前瞻断言中使用捕获组?

这段代码:

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

returns:

「a」
 0 => 「a」

但我期望也能捕获“b”。

有办法这样做吗?

我不想将“b”留在前瞻之外,因为我不希望“b”成为匹配的一部分。

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

NOTE:

我尝试使用 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

有办法这样做吗?

Not really,但有点像。有三件事阻碍我们实现这一目标。

  1. Raku 正则表达式从匹配树中捕获。因此(a(b))导致一个位置捕获包含另一位置捕获。我为什么要提到这个呢?因为同样的事情也发生在类似的事情上before,它采用正则表达式作为参数:正则表达式传递给before拥有自己的Match object.
  2. The ?暗示“不捕获”。我们可能会考虑放弃它以获得<before (b)>,并且确实有一个before键入Match现在反对,这听起来很有希望,除了......
  3. before实际上并不返回它在内部匹配的内容,而是返回一个零宽度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 = $0}> { make $lookahead } /;
say $/.made;

使用相同的输出,但现在它将可靠地附加到从m:g,所以即使不漂亮,也会很健壮。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Raku 正则表达式:如何在前瞻中使用捕获组 的相关文章

随机推荐