josh803316 has asked for the wisdom of the Perl Monks concerning the following question:

2 Part Regex Question:

1)I'm trying to get a multiline string regex to pass when all of the following lines show 'activate complete' but to fail whenever there is any string that doesn't match activate complete on each line (starting at line 1.1)

2)I'm trying to find an inline negative match operator so that the regex will fail if the word failed shows up in the string. Again using multiline matching.

I'm bound by only one thing that has to remain constant the regex itself: qr{$regex}ms
#!/usr/bin/perl use strict; use warnings; my $tests = [ 'ONT |Status |% Complete ----|--------------------|---------- 1.1 |activate complete |100 1.2 |activate complete |100 1.3 |activate complete |100 1.4 |activate complete |100 2.1 |activate complete |100 2.2 |activate complete |100 2.3 |activate failed |100 2.4 |activate complete |100 ' ]; # Negative check....should pass as long as the word failed is not in t +he text string my $regex = '^((?!failed).)*$'; #my $regex = 'ONT.*activate failed.*$'; foreach my $test (@$tests) { if($test =~ qr{$regex}ms) { print "$test\n REGEX MATCHED\n"; } else { print "$test\n REGEX DID NOT MATCH!\n"; } }

Replies are listed 'Best First'.
Re: Multi-line string regex and negative inline match
by ikegami (Patriarch) on Jul 30, 2010 at 21:46 UTC

    1) qr/\A(?:[^|]*\|\s*activate complete\s*\|[^\n]*\n?)*\z/ms

    2) qr/\A(?:(?!failed).)*\z/ms

    Update: Squashy go the bugs!

      Number 1 fails for me but number 2 works perfectly. I'm using this string of text:
      ONT |Status |% Complete ----|--------------------|---------- 1.1 |activate complete |100 1.2 |activate complete |100 1.3 |activate complete |100 1.4 |activate complete |100 1.5 |activate complete |100 1.6 |activate complete |100 1.7 |activate complete |100 1.8 |activate complete |100 1.9 |activate complete |100 1.10|activate complete |100 1.11|activate complete |100 1.12|activate complete |100 1.13|activate complete |100 1.14|activate complete |100 1.15|activate complete |100 1.16|activate complete |100 1.17|activate complete |100 1.18|activate complete |100 1.19|activate complete |100 1.20|activate complete |100 1.21|activate complete |100 1.22|activate complete |100 1.23|activate complete |100 1.24|activate complete |100 1.25|activate complete |100 1.26|activate complete |100 1.27|activate complete |100 1.28|activate complete |100 1.29|activate complete |100 1.30|activate complete |100 1.31|activate complete |100 1.32|activate complete |100 2.1 |activate complete |100 2.2 |activate complete |100 2.3 |activate complete |100 2.4 |activate complete |100 2.5 |activate complete |100 2.6 |activate complete |100 2.7 |activate complete |100 2.8 |activate complete |100

        by looking at the given regex, it fails because of the header column, So you'll have to either remove the header column or account for its existence.

        qr/\A.*?-(?:[^|]*\|\s*activate complete\s*\|[^\n]*\n?)*\z/ms; Mabye?