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?
不是真的,而是有点。在我们试图实现这一目标的过程中,有三件事对我们不利。
- Raku 正则表达式捕获匹配树的形式。因此
(a(b))
导致一个位置捕获包含另一个位置捕获。我为什么要提到这个?因为像 before
这样的事情也在发生同样的事情,它以正则表达式作为参数:传递给 before
的正则表达式得到它自己的 Match
对象。
-
?
表示“不捕获”。我们可能会考虑删除它以获得 <before (b)>
,现在 Match
对象中确实有一个 before
键,这听起来很有希望,除了...
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
返回的每个匹配对象,因此即使不漂亮也会很健壮。
如何在先行断言中使用捕获组?
此代码:
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?
不是真的,而是有点。在我们试图实现这一目标的过程中,有三件事对我们不利。
- Raku 正则表达式捕获匹配树的形式。因此
(a(b))
导致一个位置捕获包含另一个位置捕获。我为什么要提到这个?因为像before
这样的事情也在发生同样的事情,它以正则表达式作为参数:传递给before
的正则表达式得到它自己的Match
对象。 -
?
表示“不捕获”。我们可能会考虑删除它以获得<before (b)>
,现在Match
对象中确实有一个before
键,这听起来很有希望,除了... 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
返回的每个匹配对象,因此即使不漂亮也会很健壮。