我用什么正则表达式用前导零替换数字?

时间:2011-08-21 05:31:39

标签: regex perl

我有一堆像这样的字符串:

my $string1 = "xg0000";
my $string2 = "fx0015";

如何将字符串中的数字增加1,同时保持前导零以保持字符串的长度相同。

我试过了:

$string =~ s/(\d+)/0 x length(int($1)) . ($1+1)/e;

它似乎不适用于所有数字。正则表达式是我用来做这件事还是有更好的方法?

3 个答案:

答案 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重新生成具有所需宽度的新数字。