I don't think a regex is the simplest and most maintainable way to get this information. I think it is probably better to take advantage of the structure of the string to discard and find information:
#!/usr/bin/perl use strict; use warnings; for my $s (qw/binutils-2.23.52.0.1-12.el7.x86_64 compat-libcap1-1.10-3.el7.x86_64 compat-libstdc++-33-3.2.3-71.el7.i686/) { my @dots = split /\,/, $s; pop @dots; #get rid of architecture pop @dots; #get rid of os my $name_and_version = join "", @dots; my @dashes = split /-/, $s; my $build = pop @dashes; my $version = pop @dashes; my $name = join "-", @dashes; print "n $name v $version b $build\n"; } On Fri, Jul 27, 2018 at 8:57 AM Asad <asad.hasan2...@gmail.com> wrote: > Hi All , > > I want to get a regex to actually get the rpm name and version > for comparison : > > > binutils-2.23.52.0.1-12.el7.x86_64", > compat-libcap1-1.10-3.el7.x86_64" > compat-libstdc++-33-3.2.3-71.el7.i686 > > (^[a-zA-Z0-9\-]*)\-\d' > > First part of the regular expression is ^[a-zA-Z0-9\-] > > which means search for anything that begins with a letter > > (lower or upper) or a number up until you reach an > > hyphen sign (‘-‘). > > but it fails to match > > compat-libstdc++-33-3.2.3-71.el7.i686 > > Please let me know what regex should i use to extract all 3 > > rpms. > > Also let me know if there are web tools to build regex > > Good websites for regex tutorials. > > > > > Thanks, > > > > > > -- > Asad Hasan > +91 9582111698 <+91%2095821%2011698> >