http://qs321.pair.com?node_id=1108064


in reply to Regex \. help

Something using zero width negative look ahead (?!) should work:

my @t = qw( regex regex.1 regex.12 regex.1a regex.a regex.abc regex.a1 + oregex.2 ); for (@t) { print $_; print ' matches!' if /^regex(?!\.[^\d])(\.\d*)?/; print "\n"; }
gives:
regex matches! regex.1 matches! regex.12 matches! regex.1a matches! regex.a regex.abc regex.a1 oregex.2

Checkout the "Look-Around Assertions" section in the perlre documentation. In the example above, the negative look-ahead says fail if the next characters are a period followed by anything that isn't a digit.

Replies are listed 'Best First'.
Re^2: Regex \. help
by AnomalousMonk (Archbishop) on Nov 22, 2014 at 00:47 UTC

    Loops: You read the OP a bit more slowly and carefully, and came closer, I think, to answering codz67's question as a result. But the  (\.\d+)? is redundant for the given inputs and outputs if the negative look-ahead is used. (Had it been needed, it would probably have been better as a  (?:...) non-capturing group.)

    c:\@Work\Perl>perl -wMstrict -le "my @t = qw( regex regex.1 regex.12 regex.1a regex.a regex.abc regex.a +1 oregex.2 ); for (@t) { printf qq{'$_'}; printf ' matches!' if /^regex(?!\.[^\d])/; print ''; } " 'regex' matches! 'regex.1' matches! 'regex.12' matches! 'regex.1a' matches! 'regex.a' 'regex.abc' 'regex.a1' 'oregex.2'

      Hi,

      Yeah you're right about that. I confess to removing the non-capturing annotation for simplicity sake. Here's a slightly different version where the \d* isn't redundant:

      my @t = qw( regex regex. regex.1 regex.12 regex.1a regex.a regex.abc r +egex.a1 oregex.2 ); say s/^regex(?!\.[^\d])(\.\d*)?/|$&|/r for (@t);
      |regex| |regex.| |regex.1| |regex.12| |regex.1|a regex.a regex.abc regex.a1 oregex.2
        #!/usr/bin/perl @filename = `ls | grep "^regex\.[0-9]"`; print @filename; ...

        prints regex.1. I need it to print regex and regex.1:

        #!/usr/bin/perl @filename = `ls | grep "^regex\.?[0-9]"`; print @filename;

        Doesnt print anything.

        Shouldnt the ? match the . zero or more times? If so why doesnt it print regex and regex.1 As for the .abc I need that to be excluded when it greps. So regex.abc and regex.xyz wont print.

        Thank you for the help so far, I am still stuck on making this work. I will continue to try to make this work, if anyone could assist further I would be very thankful.