Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex perl正则表达式,用于返回debian/ubuntu包的部分名称_Regex_Perl_Ubuntu_Debian - Fatal编程技术网

Regex perl正则表达式,用于返回debian/ubuntu包的部分名称

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 等等 软件包名称和版本号都是虚构的,这里

是否有任何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
    
    等等

    软件包名称和版本号都是虚构的,这里只提供了我需要的一些想法。 而且,这也可以使用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