Tkills
Tkills

Reputation: 61

single regex not working for a three different patterns

I need a optimal regexp to match all these three types of texts in a text file.

  1. [TRUE,FALSE]
  2. [4,5,6,7]
  3. [2-15]

i am trying the following regex match which is not working

m/([0-9A-Fa-fx,]+)\s*[-~,]\s*([0-9A-Fa-fx,]+)/) 

Upvotes: 0

Views: 80

Answers (3)

memowe
memowe

Reputation: 2668

A quick'n'dirty test program:

#!/usr/bin/env perl

use strict;
use warnings;

for my $line (<DATA>) {

    chomp $line;
    print "$line: ";

    if ($line =~ /
            ^                                   # beginning of the string
            \[                                  # a literal opening sq. bracket
            (                                   # alternatives:
                  (TRUE|FALSE) (,(TRUE|FALSE))*     # one or more thruth words
                | (\d+) (,\d+)*                     # one or more numbers
                | (\d+) - (\d+)                     # a range of numbers
            )                                   # end of alternatives
            \]                                  # a literal closing sq. bracket
            $                                   # end of the string
        /x) {

        print "match\n";
    }
    else {
        print "no match\n";
    }
}

__DATA__
[TRUE]
foo
[FALSE,TRUE,FALSE]
[FALSE,TRUE,]
[42,FALSE]
[17,42,666]
bar
[17-42]
[17,42-666]

Output:

[TRUE]: match
foo: no match
[FALSE,TRUE,FALSE]: match
[FALSE,TRUE,]: no match
[42,FALSE]: no match
[17,42,666]: match
bar: no match
[17-42]: match
[17,42-666]: no match

Upvotes: 0

ikegami
ikegami

Reputation: 385917

/
   (?(DEFINE)
      (?<WORD> [a-zA-Z]+ )
      (?<NUM>  [0-9]+ )
   )

   \[ \s*
   (?: (?&WORD) (?: \s* , \s* (?&WORD) )+
   |   (?&NUM) (?: \s* , \s* (?&NUM) )+
   |   (?&NUM) \s* - \s* (?&NUM)
   )
   \s* \]
/x

Upvotes: 3

Andomar
Andomar

Reputation: 238116

4-7 is a subset of 2-15. This regex should capture them:

/TRUE|FALSE|[2-9]|1[0-5]/

Upvotes: 2

Related Questions