Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: Another Pattern Matching Question

by kcott (Abbot)
on Oct 12, 2012 at 16:51 UTC ( #998745=note: print w/ replies, xml ) Need Help??


in reply to Another Pattern Matching Question

G'day surib,

Welcome to the monastery.

You show the original pattern as: /3B41|2RT\.\d{10}\.\d+\.bin/. Making allowances for the lack of <code> tags, I've assumed 1|2 should be [0|1|2] - this gives a regex which matches the first filename. However, making the same assumption a few lines further down, /3B4[0|1|2]RT\.\d{10}\.\d+R?\.bin/ should have matched both filenames. Was my assumption wrong? Have you shown the correct filenames? Did you type some other part of the regex incorrectly? Please clarify.

-- Ken


Comment on Re: Another Pattern Matching Question
Select or Download Code
Replies are listed 'Best First'.
Re^2: Another Pattern Matching Question
by surib (Initiate) on Oct 12, 2012 at 17:25 UTC
    Sorry about not using the
    . Here's my code when I actually hard code the '7R', yet it still fails. + I must be missing something else? <br> <code> my ($product, $year, $month, $day, $hour, $suffix, $ver ) = spl +it /\./, $fileName; # test file name--naming convention is '<product>.<year>.<month>.<day> +.<hour>.bin' if ($fileName =~ /3B4[0|1|2]RT\.\d{10}\.\7R\.bin/) { ($product, $year, $month, $day, $hour, $ver) = ($fileName =~ /(3B4.RT)\.(\d{4})(\d\d)(\d\d)(\d\d)\.(7R\)\.bin/) +; $version = sprintf "%03d", $ver; # a little confusing, $version +is global # $ver is local } elsif ($fileName =~ /3B4\dRT\.\d\d\d\d\.\d\d\.\d\d.\d\dz\.bin/) { ($product, $year, $month, $day, $hour, $suffix) = split /\./, $fil +eName; } else { print STDERR "($0,$$) ERROR: invalid file name--'$fileName'\n" if + $opt_v; exit 2; }

      Your solution which adds R? to the original regex was on the right track and achieves what you want, albeit poorly:

      $ perl -Mstrict -Mwarnings -E 'my $fileName; my $re = qr{3B4[0|1|2]RT\.\d{10}\.\d+R?\.bin}; $fileName = "3B40RT.2000033121.7.bin.gz"; say +($fileName =~ /$re/) ? "match" : "no match"; $fileName = "3B40RT.2000033121.7R.bin.gz"; say +($fileName =~ /$re/) ? "match" : "no match"; ' match match

      I don't think you understand character classes or alternation (perhaps both). Where you're trying to match a 0, 1 or 2 in the same position, [0-2] would be far better than [0|1|2] (which is trying to match a 0, pipe, 1, pipe or 2 in the same position) - the 2nd pipe is redundant and the 1st pipe isn't wanted anyway. So, here's an improved version:

      $ perl -Mstrict -Mwarnings -E 'my $fileName; my $re = qr{3B4[0-2]RT\.\d{10}\.\d+R?\.bin}; $fileName = "3B40RT.2000033121.7.bin.gz"; say +($fileName =~ /$re/) ? "match" : "no match"; $fileName = "3B40RT.2000033121.7R.bin.gz"; say +($fileName =~ /$re/) ? "match" : "no match"; ' match match

      Recommended reading:

      -- Ken

      Or like this: (I've tried so many combinations I'm confusing myself!)
      if ($fileName =~ /3B4[0|1|2]RT\.\d{10}\.7R.bin/) { ($product, $year, $month, $day, $hour, $ver) = ($fileName =~ /(3B4.RT)\.(\d{4})(\d\d)(\d\d)(\d\d)\.(7R)\.bin/); $version = sprintf "%03d", $ver; # a little confusing, $version +is global # $ver is local
        If you just want to match 0,1, or 2 and not "|", then your character class should be [012], not [0|1|2].

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (17)
As of 2015-07-29 16:26 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (265 votes), past polls