in reply to Regex: negative look ahead

If the goal here is to do things with strings which do not match a pattern, don't try to use a negative look-ahead -- just negate the test:

my @strings = ( "ERROR blah license will expire", "ERROR blah something else", "ERROR blah Error processing Cancel Execution", ); foreach (@strings) { if (!($_ =~ /^ERROR.+?(Error processing Cancel Execution|license w +ill expire)$/)) { print "Do something with '$_'\n"; } }

Replies are listed 'Best First'.
Re^2: Regex: negative look ahead
by johngg (Canon) on Apr 10, 2012 at 12:43 UTC

    Note that

    if ( ! ( $string =~ /pattern/ ) ) {

    can be written

    if ( $string !~ /pattern/ ) {

    I hope this is of interest.

    Cheers,

    JohnGG

Re^2: Regex: negative look ahead
by fcaw1 (Initiate) on Apr 10, 2012 at 12:32 UTC
    Hi there I am writing a script with tails a log file and for each line runs multiple regular expressions against it (which are contained in a config file). Below are some examples of the log lines
    ERROR 2012-04-02 05:00:18 Error processing Cancel Execution '2012-CSNY +1CMR-1-20120402-1247 52938803o122h090000507' with LHDRSeqId 'CSNY1CMR +1-1333315812780-2759'. [2012-04-02 07:04:27,275][ERROR][101574:Company:japan][analytics.bond. +BondAlibImpl] ALIB license will expire in29 days. Please upgrade lice +nse file under /app/license 2012-04-02 05:00:18,810[ERROR] limitCheck: error while checking instru +ction xxx.core.biz.order.instruction.EquityOrderSubmitInstruction(tsI +d=20120402-090237887-340-509,order=20120402-090237880-767-508:TS)

    With my original regular expression I would want to ignore the first two lines but match the third line. Thanks!

      It could be a good idea to split the big regex.

      A good example: if you want to match lines with the words 'red' and 'dog'.

      The first idea is often to write something like: $line =~ /red.*dog|dog.*red/

      but there is a better way: $line=~/dog/ and $line=~/red/

      So, it's probably better to treat each exclusion with one regex:  next if /regex/;

      while (my $line = <DATA>) { next if $line =~ /^ERROR.*?Error processing Cancel Execution/; next if $line =~ /ERROR.*?license will expire/; print "Do something with the line: $line"; } __DATA__ ERROR 2012-04-02 05:00:18 Error processing Cancel Execution '2012-CSNY +1CMR-1-20120402-1247 52938803o122h090000507' with LHDRSeqId 'CSNY1CMR +1-1333315812780-2759'. [2012-04-02 07:04:27,275][ERROR][101574:Company:japan][analytics.bond. +BondAlibImpl] ALIB license will expire in29 days. Please upgrade lice +nse file under /app/license 2012-04-02 05:00:18,810[ERROR] limitCheck: error while checking instru +ction xxx.core.biz.order.instruction.EquityOrderSubmitInstruction(tsI +d=20120402-090237887-340-509,order=20120402-090237880-767-508:TS)