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

标签 regex regex-group raku rakudo regex-alternation

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

相关文章:

正则表达式:查找字符串中的重复项

java - 正则表达式和 GWT

regex - 如何在 Rust Nom 中匹配正则表达式但返回输入的剩余部分?

python - 提取前缀和多个后续匹配项

regex - 如何排除 URL 末尾的括号

r - 如何在左括号前插入空格

raku - 以逗号更改并行监视器大小

c# - 正则表达式无法区分 float 和 int 类型

raku - Int 数组与 Int 数组的多子数组

signature - Perl6;多子