I am trying to parse a file using the regex below. In the case of a failed match, what I would like to do is be able to determine how much of the string was matched before the regex engine gave up so that I can give a useful error message. But since 'pos' only gets set when there is a completed match, the code below will not do what I had hope it would. Do I have to break my regex into multiple pieces and use \G or is there a better way?
Thanks,
Jim
my $param_rx = '[^),]+'; my $list_start_rx = '\s*\(\s*'; my $list_end_rx = '\s*\)\s*'; $_ = $stmt; /^\s* (\S+) \s+ (\S+) $list_start_rx ($param_rx(?:\s*,\s*$param_rx)*)? $list_end_rx =\s* (?:0x)?\d+ \s*;\s*$ /cgxo; if (pos() != length($stmt)) { print "\n$stmt\n"; print ' ' x pos(); print "^<-- Parse failed here (column " . pos() . " of " . leng +th($stmt) . ")\n"; &error ($ARGV, $line_num, 'Exiting'); }
In reply to Parsing with regular expressions by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |