Regex 带有字母数字字符串和正则表达式的Perl字母排序

Regex 带有字母数字字符串和正则表达式的Perl字母排序,regex,perl,sorting,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。 所以我试图用regexp将数字强制为两位数 下面是我正在测试的一段代码: my $string = "XXXXXX-1.9.9"; my $pre = "0"; $string =

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

字符串是这样的:“XXXXX-1.0.0”,其中数字可以是一个或两个数字,表示发布版本

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

下面是我正在测试的一段代码:

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对字符串排序的方法? -如果我必须使用正则表达式,有没有一种方法可以编写它,这样我就不必执行它两次


提前感谢。

您可以使用环视断言来确保要替换的数字周围没有数字,而无需将位置移到相邻字符上

#!/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;
#/usr/bin/perl
使用警告;
严格使用;
使用特征qw{say};
my@strings=qw(XXXXX-1.9.9
XXXXX-1.9.10
XXXXX-1.10.0);

也许这个问题会有帮助好的。这很好!我现在必须了解它是如何工作的…非常感谢。