删除前导零但不是全零

时间:2011-04-15 14:45:45

标签: regex perl

如果该值仅包含零,如何删除所有前导零但保留最终零?

例如:

my $number = "0000";

我想:

my $number = "0";

我试过了:

$number =~ s/^0*//; 

但这当然会删除这种情况下的所有零。

7 个答案:

答案 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构造。