删除前导零但不是全零

per*_*foo 15 regex perl

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

例如:

my $number = "0000";
Run Code Online (Sandbox Code Playgroud)

我想拥有:

my $number = "0";
Run Code Online (Sandbox Code Playgroud)

我试过了:

$number =~ s/^0*//; 
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*Mat 21

这应该工作:

$number =~ s/^0*(\d+)$/$1/;

0    -> 0
0000 -> 0
0001 -> 1
Run Code Online (Sandbox Code Playgroud)

编辑:事实证明这有点太复杂了.这应该也有效:

$number =~ s/0*(\d+)/$1/;
Run Code Online (Sandbox Code Playgroud)

但我不确定哪个更好,取决于用例.

看看Oesor的答案:它也非常好,没有正则表达式.


Oes*_*sor 12

这不需要作为正则表达式完成.

my @nums = qw/ 00000 000 000001 002 00000005 00000064 /;
@nums = map { $_ + 0 } @nums;
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这是一个笑话,它实际上更直接地解决了可能是未说明的潜在问题,规范化数字的字符串表示. (6认同)
  • 不,只是提醒一下,将字符串放入数字然后字符串上下文中将去除前导零等。由于发生了一些其他事情,它当然不适合大量数据。例如,`perl -E“说 q(000000123456789012345678901234567890) + 0”` (2认同)

cjm*_*cjm 8

$number =~ s/^0+(?=\d)//;
Run Code Online (Sandbox Code Playgroud)

积极向前确保至少剩下一个数字,如果没有前导零,则使用+而不是*意味着跳过替换.

如果您尝试在单个字符串中规范化数字组,只需使用\b而不是^,并进行全局替换:

my $data = "0225 0000 030";
$data =~ s/\b0+(?=\d)//g;
Run Code Online (Sandbox Code Playgroud)


fno*_*kke 0

那么,如果您想全部替换为 1,只需更改为s/^0+/0/?

但是,这会将所有前导 0 替换为 1 个 0,因此如果数字前有前导零,则需要 Mats 构造。

  • “001”应该变成“1”,而不是“01” (2认同)