是否有正确识别和回馈的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
等
包名和版本号是虚构的,这里只是想知道我需要什么。 并且,这也可以使用分割// 谢谢。
答案 0 :(得分:1)
如果您希望将它们存储在单独的数组中,请使用:
#!/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'
];
答案 1 :(得分:0)
在我的系统上执行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
毫无疑问其他一些奇怪的东西。
是否有某种指导这些包的命名?如果没有某种框架,考虑到包裹的数量,我认为不可能回答这个问题。
答案 2 :(得分:0)
#!/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";
}
答案 3 :(得分:-1)
“这也可以使用拆分//。”好像你有答案......
编辑:快速正则表达式。我不确定包的所有可能形式是什么。
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'
];
答案 4 :(得分:-1)
编辑:请注意,只要您允许字段delemeter' - '进入字段内容 像这样 libapache2-mod_perl 所有的赌注都关闭了。您必须使用其他一些标准 打破田野。
我的猜测
^([^-]*)-([^-]*)-([^-]*)$
扩展
^
( [^-]* )
-
( [^-]* )
-
( [^-]* )
$
或者是可变格式
^([^-]+)(?:-([^-]*)(?:-([^-]*))?)?$
扩展
^
( [^-]+ ) # (1)
(?:
-
( [^-]* ) # (2)
(?:
-
( [^-]* ) # (3)
)?
)?
$