Perl字母排序与字母数字字符串和正则表达式

时间:2013-11-14 09:08:07

标签: regex perl sorting

我正在尝试使用perl对字母数字字符串进行排序,并且遇到以下问题:

字符串是这样的:“XXXXX-1.0.0”,其中数字可以是一位或两位数,代表发行版本。

我的问题是,当我有以下两个字符串时: - XXXXX-1.9.9 - XXXXX-1.10.0 XXXXX-1.9.9被认为大于XXXXX-1.10.0,因为9大于1。 所以我试图用正则表达式将数字强制为两位数。

我正在测试一段代码:

my $string = "XXXXXX-1.9.9";
my $pre = "0";
$string =~ s/(\.|-)+(\d{1})($|\.)/$1$pre$2$3/g;
print "$string\n";

这给了我“XXXXXX-01.9.09”的结果,这不是我想要的,因为它不会被正确排序。所以我必须这样做:

my $string = "XXXXXX-1.9.9";
my $pre = "0";
$string =~ s/(\.|-)+(\d{1})($|\.)/$1$pre$2$3/g;
$string =~ s/(\.|-)+(\d{1})($|\.)/$1$pre$2$3/g;
print "$string\n";

获取“ XXXXXX-01.09.09

我的问题是双重的: - 有没有办法在不使用正则表达式的情况下使用Perl对字符串进行排序? - 如果我必须使用正则表达式,有没有办法写它,所以我不必执行两次?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用环绕断言来确保您正在替换的数字周围没有数字,而不会移动相邻字符的位置。

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my @strings = qw( XXXXX-1.9.9
                  XXXXX-1.9.10
                  XXXXX-1.10.0 );

s/(?<=[^0-9]) ([0-9]) (?=[^0-9]|$) /0$1/xg for @strings;
@strings = sort @strings;
s/(?<=[^0-9]) 0+ ([0-9]) /$1/xg for @strings;

say for @strings;