如何在前瞻断言中使用捕获组?
这段代码:
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,但有点像。有三件事阻碍我们实现这一目标。
- Raku 正则表达式从匹配树中捕获。因此
(a(b))
导致一个位置捕获包含另一位置捕获。我为什么要提到这个呢?因为同样的事情也发生在类似的事情上before
,它采用正则表达式作为参数:正则表达式传递给before
拥有自己的Match
object.
- The
?
暗示“不捕获”。我们可能会考虑放弃它以获得<before (b)>
,并且确实有一个before
键入Match
现在反对,这听起来很有希望,除了......
-
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(使用前将#替换为@)