「a」 但我期待也能捕捉到'b'。 有没有办法这样做? 我不想将 'b' 留在前瞻之外-6ren">
gpt4 book ai didi

regex - 乐正则表达式 : How to use capturing group inside lookaheads

转载 作者:行者123 更新时间:2023-12-03 17:07:13 25 4
gpt4 key购买 nike

如何在前瞻断言中使用捕获组?
这段代码:

say "ab" ~~ m/(a) <?before (b) > /;
返回:
「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)> ,确实有一个before键入Match现在反对,这听起来很有希望,除了...
  • before实际上并没有返回它在内部匹配的内容,而是一个零宽度 Match对象,否则如果我们确实忘记了 ?我们最终会发现它不是超前的。

  • 如果我们能拯救 Match前瞻内部的对象。好吧,我们可以!我们可以声明一个变量然后绑定(bind) $/ 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 返回的每个匹配对象,因此即使不漂亮,也会很健壮。

    关于regex - 乐正则表达式 : How to use capturing group inside lookaheads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64898346/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com