Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot

Re: Regex \. help

by Loops (Curate)
on Nov 22, 2014 at 00:19 UTC ( #1108064=note: print w/replies, xml ) Need Help??

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.a1 + oregex.2 ); for (@t) { print $_; print ' matches!' if /^regex(?!\.[^\d])(\.\d*)?/; print "\n"; }
regex matches! regex.1 matches! regex.12 matches! regex.1a matches! regex.a 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 (Bishop) 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.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.a1' 'oregex.2'


      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 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.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 and 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.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1108064]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (5)
As of 2021-04-16 03:45 GMT
Find Nodes?
    Voting Booth?

    No recent polls found