使用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/