Raku:从字符串中捕获组的一行表达式?
Raku: One line expression to capture group from string?
我正在从字符串中捕获一个数字:
my $n1;
if $string1 ~~ /(<[0..4]>)$/ {
$n1 = [=10=];
} else {
put "$string1 failed regex.";
die;
}
这是很多行,但我可以在一行中复制和编辑字符串:
my $string2 = $group2.subst(/<[0..4]>$/, '');
我还在学习 raku/perl6,我已经看过 https://docs.perl6.org/type/Str Raku 似乎不能做到这一点......但我不确定。
有没有一种方法可以在一行中捕获子字符串,类似于上面的第一个代码示例?
我在我的脚本中重复这个过程,它真的会缩短我的脚本
也许 .match 就是您要找的。
my $string1='4';
my $n2 = $string1.match(/(<[0..4]>)$/) // die 'error';
say $n2.values;
可以使用解构绑定将匹配的部分提取到变量中。对于给出的示例,我们可以像这样提取匹配的部分:
my ($n) := "abc123" ~~ /(<[1..4]>+)$/;
say $n; # 「123」
这会扩展到提取匹配项的多个部分:
my ($s, $n) := "abc123" ~~ /(<[a..z]>+)(<[1..4]>+)$/;
say $s; # 「abc」
say $n; # 「123」
Raku 中捕获的东西本身就是 Match
对象,但也可以在解构中使用强制转换,以便将其转换为整数:
my (Int() $n) := "abc123" ~~ /(<[1..4]>+)$/;
say $n; # 123
say $n.WHAT; # (Int)
它甚至可以与命名匹配一起使用(这里有点人为,但如果您正在调用子规则则很方便):
my (:$s, :$n) := "abc123" ~~ /$<s>=(<[a..z]>+) $<n>=(<[1..4]>+)$/;
say $s; # 「abc」
say $n; # 「123」
这样做的明显缺点是,如果匹配失败,可能会出现异常。值得庆幸的是,这可以与 if
:
结合使用
if "abc123" ~~ /(<[a..z]>+)(<[1..4]>+)$/ -> ($s, $n) {
say $s;
say $n;
}
同样的语法也有效,因为解构绑定实际上只是签名的应用。
我正在从字符串中捕获一个数字:
my $n1;
if $string1 ~~ /(<[0..4]>)$/ {
$n1 = [=10=];
} else {
put "$string1 failed regex.";
die;
}
这是很多行,但我可以在一行中复制和编辑字符串:
my $string2 = $group2.subst(/<[0..4]>$/, '');
我还在学习 raku/perl6,我已经看过 https://docs.perl6.org/type/Str Raku 似乎不能做到这一点......但我不确定。
有没有一种方法可以在一行中捕获子字符串,类似于上面的第一个代码示例?
我在我的脚本中重复这个过程,它真的会缩短我的脚本
也许 .match 就是您要找的。
my $string1='4';
my $n2 = $string1.match(/(<[0..4]>)$/) // die 'error';
say $n2.values;
可以使用解构绑定将匹配的部分提取到变量中。对于给出的示例,我们可以像这样提取匹配的部分:
my ($n) := "abc123" ~~ /(<[1..4]>+)$/;
say $n; # 「123」
这会扩展到提取匹配项的多个部分:
my ($s, $n) := "abc123" ~~ /(<[a..z]>+)(<[1..4]>+)$/;
say $s; # 「abc」
say $n; # 「123」
Raku 中捕获的东西本身就是 Match
对象,但也可以在解构中使用强制转换,以便将其转换为整数:
my (Int() $n) := "abc123" ~~ /(<[1..4]>+)$/;
say $n; # 123
say $n.WHAT; # (Int)
它甚至可以与命名匹配一起使用(这里有点人为,但如果您正在调用子规则则很方便):
my (:$s, :$n) := "abc123" ~~ /$<s>=(<[a..z]>+) $<n>=(<[1..4]>+)$/;
say $s; # 「abc」
say $n; # 「123」
这样做的明显缺点是,如果匹配失败,可能会出现异常。值得庆幸的是,这可以与 if
:
if "abc123" ~~ /(<[a..z]>+)(<[1..4]>+)$/ -> ($s, $n) {
say $s;
say $n;
}
同样的语法也有效,因为解构绑定实际上只是签名的应用。