如果该值仅包含零,如何删除所有前导零但保留最终零?
例如:
my $number = "0000";
我想:
my $number = "0";
我试过了:
$number =~ s/^0*//;
但这当然会删除这种情况下的所有零。
答案 0 :(得分:21)
这应该有效:
$number =~ s/^0*(\d+)$/$1/;
0 -> 0
0000 -> 0
0001 -> 1
编辑:事实证明这有点太复杂了。这也应该有效:
$number =~ s/0*(\d+)/$1/;
但我不确定哪个更好,取决于用例。
请查看Oesor的答案:它也非常好,不涉及正则表达式。
答案 1 :(得分:12)
这不需要作为正则表达式完成。
my @nums = qw/ 00000 000 000001 002 00000005 00000064 /;
@nums = map { $_ + 0 } @nums;
答案 2 :(得分:8)
$number =~ s/^0+(?=\d)//;
正向前瞻确保至少剩下一个数字,并且使用+
代替*
表示如果没有前导零,则跳过替换。
如果您尝试在一个字符串中规范化数字组,只需使用\b
代替^
,然后进行全局替换:
my $data = "0225 0000 030";
$data =~ s/\b0+(?=\d)//g;
答案 3 :(得分:2)
有些答案隐含地假设只存在数字或$number
实际上是数字。如果不是这样的话:
s/^0+(?=.)//s
甚至:
substr($number,0,-1) =~ s/^0+//s
答案 4 :(得分:2)
如果您的$number
是整数,另一种方法是使用printf:
for my $number (qw(005 05 5 000 0 500)) {
printf "%d\n", $number;
}
__END__
5
5
5
0
0
500
编辑:正如ysth指出的那样,它适用于所有整数,而不仅仅是我最初所说的正整数。
答案 5 :(得分:1)
只需在字符串中添加0,以便将其隐式转换为数字:
my $var = '0000035600000';
$var += 0;
答案 6 :(得分:0)
如果您想要一个一个地替换,只需更改为s/^0+/0/
?
但是,这会将所有前导0替换为0,所以如果你在数字之前有前导零,则需要使用Mats构造。