gpt4 book ai didi

regex - Raku regex : How to know which group was captured at an alternation

转载 作者:行者123 更新时间:2023-12-03 15:38:57 25 4
gpt4 key购买 nike

使用perl(以及几乎任何正则表达式),每个组都按顺序编号。
因此,例如,此代码:

'bar' =~ m/(foo)|(bar)/;

print $1 // 'x'; # (1-based index)
print $2 // 'x'; # (1-based index)
打印 xbar但是,使用Raku时,其行为就像是一个包裹整个正则表达式的 branch reset group:
'bar' ~~ m/(foo)|(bar)/;

print $0 // 'x'; # (0-based index)
print $1 // 'x'; # (0-based index)
打印 barx我可以接受这种行为:)。但是,有时知道知道哪个组是在轮替下被捕获的,这很有用。
我怎么知道与乐天的人?

最佳答案

有几种方法可以实现不同程度的实用性。
一种方法是明确告诉Raku您希望数字是多少:

'bar' ~~ m/$1=(foo)|$2=(bar)/;
如果您扩展正则表达式,计数将继续在$ 3。
一个不那么推荐的方法是偷偷地套上一个额外的括号:
'bar' ~~ m/(foo)|()(bar)/;
foo将匹配$ 0中的第一个,并且$ 1是未定义的, bar将匹配$ 1,其中$ 0为空(但不是未定义)。 TIMTOWTDI,但这不是一个很好的;-)
另一种方法是使用标志:
 my $flag;
'bar' ~~ m/(foo {$flag = 'first'} ) | (bar {$flag = 'second'} )/;
该标志将根据匹配设置。实际上,这可能是一种不可怕的处理方式,尤其是当您的标志是二进制的并且您将有一些逻辑可以运行时。
另一种类似的方法是利用通常在操作类中使用的 .make/ .made,但仍可以内联使用:
'bar' ~~ m/(foo {make 'first'} ) | (bar {make 'second'} )/;
say $0.made; # 'second'
如果您有很多元数据要与之关联,那么这是一个不错的选择(但是,仅知道选择了哪一个元数据可能就太过分了)。

关于regex - Raku regex : How to know which group was captured at an alternation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64394967/

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