问题描述
|
如果值仅包含零,如何删除所有前导零,而保留最后一个零?
例如:
my $number = \"0000\";
我想拥有:
my $number = \"0\";
我试过了:
$number =~ s/^0*//;
但是在这种情况下,这当然会删除所有零。
解决方法
这应该工作:
$number =~ s/^0*(\\d+)$/$1/;
0 -> 0
0000 -> 0
0001 -> 1
编辑:事实证明,这有点太复杂了。这也应该起作用:
$number =~ s/0*(\\d+)/$1/;
但我不确定哪个更好,取决于用例。
请检查一下Oesor的答案:它也很漂亮,不涉及任何正则表达式。
,不需要作为正则表达式来完成。
my @nums = qw/ 00000 000 000001 002 00000005 00000064 /;
@nums = map { $_ + 0 } @nums;
,$number =~ s/^0+(?=\\d)//;
正的前瞻确保剩下至少一位数字,并且使用+
而不是*
表示如果没有前导零,则跳过替换。
如果您要规范单个字符串中的数字组,只需使用\\b
而不是^
,然后进行全局替换:
my $data = \"0225 0000 030\";
$data =~ s/\\b0+(?=\\d)//g;
,如果您的$number
是整数,则另一种方法是使用printf:
for my $number (qw(005 05 5 000 0 500)) {
printf \"%d\\n\",$number;
}
__END__
5
5
5
0
0
500
编辑:正如ysth所指出的,它适用于所有整数,而不仅仅是我最初所说的正整数。
,某些答案是隐含的,假设仅存在数字,或者$number
实际上是数字。如果不是这种情况:
s/^0+(?=.)//s
甚至:
substr($number,-1) =~ s/^0+//s
,只需在字符串上添加0,即可将其隐式转换为数字:
my $var = \'0000035600000\';
$var += 0;
,好吧,如果您想将所有内容替换为一个,只需更改为s/^0+/0/
?
但是,这会将所有前导0 \替换为一个0,因此,如果在数字之前有前导零,则需要Mats构造。