Regex perl正则表达式,用于返回debian/ubuntu包的部分名称
是否有任何perl正则表达式技巧可以正确识别并返回Regex perl正则表达式,用于返回debian/ubuntu包的部分名称,regex,perl,ubuntu,debian,Regex,Perl,Ubuntu,Debian,是否有任何perl正则表达式技巧可以正确识别并返回 包名 包上游 包维护程序版本 能与任何ubuntu/debian软件包一起使用吗?(注:任何) 下面只是一个例子。 例如,sipcalc-1.2.3-1的解析如下: $1 = sipcalc $2 = 1.2.3 $3 = 1 libapache2-mod_perl-2.3.4-ubuntu5的解析如下 $1 = libapache2-mod_perl $2 = 2.3.4 $3 = ubuntu5 等等 软件包名称和版本号都是虚构的,这里
sipcalc-1.2.3-1
的解析如下:
$1 = sipcalc
$2 = 1.2.3
$3 = 1
libapache2-mod_perl-2.3.4-ubuntu5
的解析如下
$1 = libapache2-mod_perl
$2 = 2.3.4
$3 = ubuntu5
等等
软件包名称和版本号都是虚构的,这里只提供了我需要的一些想法。
而且,这也可以使用split//。谢谢 “这也可以使用split/。”似乎你有一个答案 编辑:快速正则表达式。我不确定包裹的所有可能结构
use Data::Dumper;
my $string1 = "libapache2-mod_perl-2.3.4-ubuntu5";
my @matches = $string1 =~ m/([a-z0-9\-_]+)-([0-9.]+)-([a-z0-9]+)/i;
print Dumper \@matches;
$VAR1 = [
'libapache2-mod_perl',
'2.3.4',
'ubuntu5'
];
如果要将它们存储在单独的阵列中,请使用以下方法:
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my @names = ('sipcalc-1.2.3-1', 'libapache2-mod_perl-2.3.4-ubuntu5', 'libapt-inst1.4-0.8.16~exp12ubuntu10.10','isc-dhcp-common-4.1.ESV-R4-0ubuntu5.8', 'libaprutil1-1.3.12+dfsg-3');
my (@var1, @var2, @var3);
foreach (@names) {
my ($match1, $match2, $match3) = ($_ =~ /(.*)\-([\d\.]+)\W([a-z]*.*)/i);
push @var1, $match1;
push @var2, $match2;
push @var3, $match3;
}
print Dumper (\@var1);
print Dumper (\@var2);
print Dumper (\@var3);
输出:
$VAR1 = [
'sipcalc',
'libapache2-mod_perl',
'libapt-inst1.4',
'isc-dhcp-common',
'libaprutil1'
];
$VAR1 = [
'1.2.3',
'2.3.4',
'0.8.16',
'4.1',
'1.3.12'
];
$VAR1 = [
'1',
'ubuntu5',
'exp12ubuntu10.10',
'ESV-R4-0ubuntu5.8',
'dfsg-3'
];
在我的系统上完成dpkg-l后,我发现有许多外观独特的案例 任何成功的正则表达式都必须考虑以下情况: libapt-inst1.4-0.8.16~exp12ubuntu10.10 libaprutil1-1.3.12+dfsg-3 isc-dhcp-common-4.1.ESV-R4-0ubuntu5.8 毫无疑问,还有一些奇怪的 对于这些包的命名有什么指导吗?如果没有某种框架可以遵循,考虑到软件包的数量,我认为不可能回答这个问题。
#/usr/bin/perl
#!/usr/bin/perl
use strict;
my @packages=`rpm -qa`;
foreach my $package ( @packages )
{
print "Package $package \n";
my @parts = split(/\-/, $package);
my $last=$#parts;
my $maint_ver=$parts[$last];
my $ver=$parts[$last-1];
pop @parts; pop @parts;
my $package_name=join("-",@parts);
if ($ver !~ /\d+.\d+/ )
{
print "package naming error: $package \n";
}
print "$package_name <-> $ver <-> $maint_ver \n";
}
严格使用;
my@packages=`rpm-qa`;
foreach my$套餐(@packages)
{
打印“包$Package\n”;
my@parts=拆分(/\-/,$package);
我的$last=$#零件;
my$maint\u ver=$parts[$last];
my$ver=$parts[$last-1];
pop@零件;pop@零件;
我的$package_name=join(“-”,@parts);
如果($ver!~/\d+。\d+/)
{
打印“包命名错误:$package\n”;
}
打印“$package\u name$ver$maint\u ver\n”;
}
no,因为我需要“尽可能长匹配的拆分”,在最后一种情况下,我将使用正则表达式示例更新:$1=libapache2$2=mod$3=perl$4=ubuntu5
。