有几件事会导致捕获索引重置。|
并且||
恰好是一个。
将它放在另一个捕获组中是另一回事。(因为匹配结果是一棵树。)
在设计 Raku 时,所有东西都经过重新设计,变得更一致、更有用、更强大。包括正则表达式。
如果你有这样的替代:
/ (foo) | (bar) /
您可能希望像这样使用它:
$line ~~ / (foo) | (bar) /;
say %h{ ~$0 };
如果(bar)
是$1
,你将不得不这样写:
$line ~~ / (foo) | (bar) /;
say %h{ ~$0 || ~$1 };
捕获组编号从零重新开始通常更有用。
这也使得正则表达式更像是一种通用编程语言。(每个“块”都是一个独立的子表达式。)
现在有时重新编号捕获组可能会很好。
/ ^
[ (..) '-' (..) '-' (....) # mm-dd-yyyy
| (..) '-' (....) # mm-yyyy
]
$ /
请注意,该yyyy
部分是$2
或$1
取决于是否dd
包含该部分。
my $day = +$2 ?? $1 !! 1;
my $month = +$0;
my $year = +$2 || +$1;
我们可以将 重新编号yyyy
为 always be $2
。
/ ^
[ (..) '-' (..) '-' (....) # mm-dd-yyyy
| (..) '-' $2 = (....) # mm-yyyy
]
$ /
my $day = +$1 || 1;
my $month = +$0;
my $year = +$2;
或者如果我们也需要接受怎么办yyyy-mm-dd
/ ^
[ (..) '-' (..) '-' (....) # mm-dd-yyyy
| (..) '-' $2 = (....) # mm-yyyy
| $2 = (....) '-' $0 = (..) '-' $1 = (..) # yyyy-mm-dd
]
$ /
my $day = +$1 || 1
my $month = +$0;
my $year = +$2;
实际上,现在我们有很多捕获组,让我们再看看如果|
没有导致编号的捕获组重新开始,我们将如何处理它$0
/ ^
[ (..) '-' (..) '-' (....) # mm-dd-yyyy
| (..) '-' (....) # mm-yyyy
| (....) '-' (..) '-' (..) # yyyy-mm-dd
]
$ /
my $day = +$1 || +$7 || 1;
my $month = +$0 || +$3 || +$6;
my $year = +$2 || +$4 || +$5;
那不是很好。
一方面,您必须确保正则表达式和my $day
匹配正确。
快速不计算捕获组,确保这些数字与正确的捕获组匹配。
当然,这仍然存在一个问题,即具有名称的概念会被数字捕获。
所以我们应该改用名字。
/ ^
[ $<month> = (..) '-' $<day> = (..) '-' $<year> = (....) # mm-dd-yyyy
| $<month> = (..) '-' $<year> = (....) # mm-yyyy
| $<year> = (....) '-' $<month> = (..) '-' $<day> = (..) # yyyy-mm-dd
]
$ /
my $day = +$<day> || 1;
my $month = +$<month>;
my $year = +$<year>;
长话短说,我会这样做:
/ $<foo> = (foo) | $<bar> = (bar) /;
if $<foo> {
…
} elsif $<bar> {
…
}