Удалить ведущие нули, но не все нули
Как удалить все начальные нули, но оставить окончательный ноль, если значение содержит только нули?
например:
my $number = "0000";
Я бы хотел:
my $number = "0";
Я пробовал:
$number =~ s/^0*//;
но это, конечно, удаляет все нули в этом случае.
Ответы
Ответ 1
Это должно работать:
$number =~ s/^0*(\d+)$/$1/;
0 -> 0
0000 -> 0
0001 -> 1
Изменить: получается, что это слишком сложно. Это также должно работать:
$number =~ s/0*(\d+)/$1/;
но я не уверен, что лучше, зависит от варианта использования.
Откажитесь от ответа Oesor: это тоже очень мило, не связано с регулярным выражением.
Ответ 2
Это не нужно делать как регулярное выражение.
my @nums = qw/ 00000 000 000001 002 00000005 00000064 /;
@nums = map { $_ + 0 } @nums;
Ответ 3
$number =~ s/^0+(?=\d)//;
Положительный lookahead гарантирует, что по крайней мере одна цифра оставлена, а использование +
вместо *
означает, что подстановка пропущена, если нет нужных нулей.
Если вы пытаетесь нормализовать группы чисел в одной строке, просто используйте \b
вместо ^
и выполните глобальную замену:
my $data = "0225 0000 030";
$data =~ s/\b0+(?=\d)//g;
Ответ 4
Некоторые ответы подразумевают, что присутствуют только цифры или что $number
на самом деле является числом. Если это не так:
s/^0+(?=.)//s
Или даже:
substr($number,0,-1) =~ s/^0+//s
Ответ 5
Если ваш $number
является целым числом, другим способом является использование printf:
for my $number (qw(005 05 5 000 0 500)) {
printf "%d\n", $number;
}
__END__
5
5
5
0
0
500
Изменить: Как указывает ysth, он работает для всех целых чисел, а не только для положительных целых чисел, как я изначально заявил.
Ответ 6
Просто добавьте 0 к строке, чтобы она неявно конвертировалась в число:
my $var = '0000035600000';
$var += 0;
Ответ 7
Ну, если вы хотите заменить все на один, просто измените на s/^0+/0/
?
Однако это заменит все ведущие 0 на один 0, поэтому, если у вас есть ведущие нули перед номерами, вам понадобится конструкция Mats.