【问题标题】:What regular expression do I use for replacing numbers with leading zeros?我用什么正则表达式用前导零替换数字?
【发布时间】:2011-08-21 05:31:38
【问题描述】:

我有一堆这样的字符串:

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

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

我试过了:

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

它似乎不适用于所有数字。正则表达式是我应该使用的还是有更好的方法?

【问题讨论】:

  • “xg9999”加一会发生什么?
  • 这只是一个例子(一个可怜的例子)。我的真实字符串从 00 开始,增量永远不会超过 50,所以我不必担心它会变为 99 并溢出。

标签: regex perl


【解决方案1】:

来点 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

【讨论】:

  • 哦,酷。我不知道你可以这样声明一个变量。
  • 如果您认为这很酷,那么您显然还没有看到我的问题的更新。 ;)
  • 嗯。如果字符串是“abc1xg0002”但适用于正则表达式,这似乎不起作用。我应该在最初的问题中提到它在 xg 之前也可以有数字和字符,但只有最后一系列数字是我感兴趣的增量。
  • @ces 我想它的神奇之处不止一种。但是不,它不只是查找数字,它还可以包含一个字符串,例如 'xa'。
  • 查看我的帖子 Be careful with Unicode character ranges 了解有关此魔法的详细信息。
【解决方案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";
    }

【讨论】:

    【解决方案3】:

    用正则表达式解决这个问题真的很糟糕。增加一个数可以改变无限位数,实际上也可以改变非零位数!除非您发誓一年内只使用正则表达式,否则请使用正则表达式提取数字,然后使用sprintf "%06d" $x+1 重新生成具有所需宽度的新数字。

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      相关资源
      最近更新 更多