在 Perl 6 中使用循环组合正则表达式
Combining regexes using a loop in Perl 6
在这里,我从数组的 Regex
个元素手动创建了一个 regex
。
my Regex @reg =
/ foo /,
/ bar /,
/ baz /,
/ pun /
;
my $r0 = @reg[0];
my $r1 = @reg[1];
my Regex $r = / 0 $r0 | 1 $r1 /;
"0foo_1barz" ~~ m:g/<$r>/;
say $/; # (「0foo」 「1bar」)
如何使用for @reg {...}
?
my @reg =
/foo/,
/bar/,
/baz/,
/pun/
;
my $i = 0;
my $reg = @reg
.map({ $_ = .perl; $_.substr(1, $_.chars - 2); })
.map({ "{$i++}{$_}" })
.join('|');
my @match = "foo", "0foo_1barz" ~~ m:g/(<{$reg}>) /;
say @match[1][0].Str;
say @match[1][1].Str;
# 0foo
# 2baz
编辑:实际上我自己阅读了文档。将隐式评估更改为 $() 构造。
编辑:重写了实际有效的答案
编辑:更改了对一个非常糟糕的骇客攻击的回答
如果一个变量包含一个正则表达式,您可以在另一个正则表达式中直接使用它。
第二个技巧是在正则表达式中使用数组变量,相当于数组元素的析取:
my @reg =
/foo/,
/bar/,
/baz/,
/pun/
;
my @transformed = @reg.kv.map(-> $i, $rx { rx/ $i $rx /});
my @match = "0foo_1barz" ~~ m:g/ @transformed /;
.say for @match;
在这里,我从数组的 Regex
个元素手动创建了一个 regex
。
my Regex @reg =
/ foo /,
/ bar /,
/ baz /,
/ pun /
;
my $r0 = @reg[0];
my $r1 = @reg[1];
my Regex $r = / 0 $r0 | 1 $r1 /;
"0foo_1barz" ~~ m:g/<$r>/;
say $/; # (「0foo」 「1bar」)
如何使用for @reg {...}
?
my @reg =
/foo/,
/bar/,
/baz/,
/pun/
;
my $i = 0;
my $reg = @reg
.map({ $_ = .perl; $_.substr(1, $_.chars - 2); })
.map({ "{$i++}{$_}" })
.join('|');
my @match = "foo", "0foo_1barz" ~~ m:g/(<{$reg}>) /;
say @match[1][0].Str;
say @match[1][1].Str;
# 0foo
# 2baz
编辑:实际上我自己阅读了文档。将隐式评估更改为 $() 构造。
编辑:重写了实际有效的答案
编辑:更改了对一个非常糟糕的骇客攻击的回答
如果一个变量包含一个正则表达式,您可以在另一个正则表达式中直接使用它。
第二个技巧是在正则表达式中使用数组变量,相当于数组元素的析取:
my @reg =
/foo/,
/bar/,
/baz/,
/pun/
;
my @transformed = @reg.kv.map(-> $i, $rx { rx/ $i $rx /});
my @match = "0foo_1barz" ~~ m:g/ @transformed /;
.say for @match;