Какое регулярное выражение я использую для замены чисел ведущими нулями? - PullRequest
2 голосов
/ 21 августа 2011

У меня есть куча таких строк:

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

Что я делаю, чтобы увеличить число в строке на 1, а также сохранить ведущие нули, чтобы длина строки оставалась неизменной.

Я пробовал это:

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

Кажется, он работает не на всех числах. Является ли регулярное выражение тем, что я предполагаю использовать для этого, или есть лучший способ?

Ответы [ 3 ]

4 голосов
/ 21 августа 2011

Как насчет немного магии 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
2 голосов
/ 21 августа 2011

Вы также можете сделать это с помощью 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";
    }
1 голос
/ 21 августа 2011

Это действительно плохая задача, которую нужно решить с помощью регулярного выражения.Увеличение числа может изменить неограниченное количество цифр, и фактически может также изменить количество ненулевых цифр!Если вы не дали клятву использовать только регулярные выражения в течение года, используйте регулярное выражение для извлечения числа, а затем sprintf "%06d" $x+1 для восстановления нового числа с желаемой шириной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...