perl 删除前导零,但不删除所有零

uubf1zoe  于 2022-11-15  发布在  Perl
关注(0)|答案(8)|浏览(361)

如果值只包含零,如何删除所有前导零,但保留最后一个零?
例如:

my $number = "0000";

我希望:

my $number = "0";

我试探着:

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

但是在这种情况下这当然去除了所有的零。

axkjgtzd

axkjgtzd1#

这应该可行:

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

0    -> 0
0000 -> 0
0001 -> 1

编辑:事实证明这有点太复杂了。这也应该行得通:

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

但我不确定哪个更好,这取决于用例。
请查看Oesor的答案:这也很好,不涉及正则表达式。

41zrol4v

41zrol4v2#

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

my @nums = qw/ 00000 000 000001 002 00000005 00000064 /;
@nums = map { $_ + 0 } @nums;
iqih9akk

iqih9akk3#

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

正的lookahead可确保至少还有一个数字,而使用+代替*意味着如果没有前导零,则跳过替换。
如果你想对单个字符串中的一组数字进行规范化,只需使用\b而不是^,并进行全局替换:

my $data = "0225 0000 030";
$data =~ s/\b0+(?=\d)//g;
xcitsw88

xcitsw884#

如果你的$number是一个整数,另一种方法是使用printf

for my $number (qw(005 05 5 000 0 500)) {
    printf "%d\n", $number;
}

__END__

5
5
5
0
0
500

编辑:正如ysth所指出的,它对所有整数都有效,而不仅仅是我最初所说的正整数。

omqzjyyz

omqzjyyz5#

有些答案隐含地假设只有数字存在,或者$number实际上是一个数字。如果不是这样:

s/^0+(?=.)//s

或者甚至:

substr($number,0,-1) =~ s/^0+//s
iyfamqjs

iyfamqjs6#

只需将0添加到字符串中,这样就可以将其隐式转换为数字:

my $var = '0000035600000';
$var += 0;
wgx48brx

wgx48brx7#

您也可以在Perl中使用sprintf函数:

# Input variables
$valuesA = "0";
$valuesB = "00001";
$valuesC = "000.1";
$valuesD = "00010";

# Format number with zero leading zeroes
# $valuesA = sprintf("%0d", $valuesA);
$valuesA = sprintf("%0g", $valuesA);
$valuesB = sprintf("%0g", $valuesB);
$valuesC = sprintf("%0g", $valuesC);
$valuesD = sprintf("%0g", $valuesD);

# Output variables
print "valuesA: $valuesA\n"; # returns "0"
print "valuesB: $valuesB\n"; # returns "1"
print "valuesC: $valuesC\n"; # returns "0.1"
print "valuesD: $valuesD\n"; # returns "10"
zfciruhq

zfciruhq8#

如果你想用一个替换所有的,就改成s/^0+/0/吧?
然而,这将用一个0替换所有前导0,因此如果您在数字前有前导0,您将需要Mats构造

相关问题