我有一堆像这样的字符串:
my $string1 = "xg0000";
my $string2 = "fx0015";
如何将字符串中的数字增加1,同时保持前导零以保持字符串的长度相同。
我试过了:
$string =~ s/(\d+)/0 x length(int($1)) . ($1+1)/e;
它似乎不适用于所有数字。正则表达式是我用来做这件事还是有更好的方法?
答案 0 :(得分:4)
一点perl魔法怎么样? ++
运算符甚至可以在字符串上运行,0000
会神奇地变成0001
。
现在,我们无法修改$1
,因为它是只读的,但我们可以使用中间变量。
use strict;
use warnings;
my $string = "xg0000";
$string =~ s/(\d+)/my $x=$1; ++$x/e;
更新
我以前没想过这个,但实际上它没有正则表达式:
C:\perl>perl -we "$str = 'xg0000'; print ++$str;"
xg0001
还没有解决DavidO指出的9999
问题。您必须决定如何处理这些数字。 Perl有一个相当有趣的解决方案:
C:\perl>perl -we "$str = 'xg9999'; print ++$str;"
xh0000
答案 1 :(得分:2)
您也可以使用sprintf执行此操作,并根据您捕获的位数使用您计算的长度:
use strict;
use warnings;
my $string = "xg00000";
foreach ( 0 .. 9 ) {
$string =~ s/([0-9]+)\z/
my $l = length $1;
sprintf "%0${l}d", $1 + 1;
/e;
print "$string\n";
}
答案 2 :(得分:1)
使用正则表达式解决这是一项非常糟糕的任务。增加一个数字可以改变无限数量的数字,实际上也可以改变非零数字的数量!除非您宣誓一年只使用正则表达式,否则请使用正则表达式提取数字,然后使用sprintf "%06d" $x+1
重新生成具有所需宽度的新数字。