如果值只包含零,如何删除所有前导零,但保留最后一个零?例如:
my $number = "0000";
我希望:
my $number = "0";
我试探着:
$number =~ s/^0*//;
但是在这种情况下这当然去除了所有的零。
axkjgtzd1#
这应该可行:
$number =~ s/^0*(\d+)$/$1/; 0 -> 0 0000 -> 0 0001 -> 1
编辑:事实证明这有点太复杂了。这也应该行得通:
$number =~ s/0*(\d+)/$1/;
但我不确定哪个更好,这取决于用例。请查看Oesor的答案:这也很好,不涉及正则表达式。
41zrol4v2#
这不需要作为正则表达式来完成。
my @nums = qw/ 00000 000 000001 002 00000005 00000064 /; @nums = map { $_ + 0 } @nums;
iqih9akk3#
$number =~ s/^0+(?=\d)//;
正的lookahead可确保至少还有一个数字,而使用+代替*意味着如果没有前导零,则跳过替换。如果你想对单个字符串中的一组数字进行规范化,只需使用\b而不是^,并进行全局替换:
+
*
\b
^
my $data = "0225 0000 030"; $data =~ s/\b0+(?=\d)//g;
xcitsw884#
如果你的$number是一个整数,另一种方法是使用printf:
$number
for my $number (qw(005 05 5 000 0 500)) { printf "%d\n", $number; } __END__ 5 5 5 0 0 500
编辑:正如ysth所指出的,它对所有整数都有效,而不仅仅是我最初所说的正整数。
omqzjyyz5#
有些答案隐含地假设只有数字存在,或者$number实际上是一个数字。如果不是这样:
s/^0+(?=.)//s
或者甚至:
substr($number,0,-1) =~ s/^0+//s
iyfamqjs6#
只需将0添加到字符串中,这样就可以将其隐式转换为数字:
my $var = '0000035600000'; $var += 0;
wgx48brx7#
您也可以在Perl中使用sprintf函数:
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"
zfciruhq8#
如果你想用一个替换所有的,就改成s/^0+/0/吧?然而,这将用一个0替换所有前导0,因此如果您在数字前有前导0,您将需要Mats构造
s/^0+/0/
8条答案
按热度按时间axkjgtzd1#
这应该可行:
编辑:事实证明这有点太复杂了。这也应该行得通:
但我不确定哪个更好,这取决于用例。
请查看Oesor的答案:这也很好,不涉及正则表达式。
41zrol4v2#
这不需要作为正则表达式来完成。
iqih9akk3#
正的lookahead可确保至少还有一个数字,而使用
+
代替*
意味着如果没有前导零,则跳过替换。如果你想对单个字符串中的一组数字进行规范化,只需使用
\b
而不是^
,并进行全局替换:xcitsw884#
如果你的
$number
是一个整数,另一种方法是使用printf:编辑:正如ysth所指出的,它对所有整数都有效,而不仅仅是我最初所说的正整数。
omqzjyyz5#
有些答案隐含地假设只有数字存在,或者
$number
实际上是一个数字。如果不是这样:或者甚至:
iyfamqjs6#
只需将0添加到字符串中,这样就可以将其隐式转换为数字:
wgx48brx7#
您也可以在Perl中使用
sprintf
函数:zfciruhq8#
如果你想用一个替换所有的,就改成
s/^0+/0/
吧?然而,这将用一个0替换所有前导0,因此如果您在数字前有前导0,您将需要Mats构造