Hello cmic,
Did you notice that for the line beginning with "TAGS", the capture includes that word? Even though it is non-greedy, (.*?) starts looking at the beginning of the string and eventually settles on the capture string "TAGS text four ", which satisfies both the lookahead (because it is followed by "TAG2") AND the negative lookbehind — because the string (which includes "TAGS") is not preceeded by "TAGS" !
In general, you can’t combine a negative lookbehind assertion with a match-any-character(s) capture. Do this instead:
use strict; use warnings; while (<DATA>) { print "$1\n" if !/^TAGS/ && /(.*?)(?=TAG2)/; }
Update: Actually, in this case you don’t need a lookahead assertion either. This does just as well:
print "$1\n" if !/^TAGS/ && /(.*?)TAG2/;
Hope that helps,
| Athanasius <°(((>< contra mundum | Iustus alius egestas vitae, eros Piratica, |
In reply to Re: lookbehind regexp
by Athanasius
in thread lookbehind regexp
by cmic
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |