You want a "negative lookahead":
use warnings; use strict; while(<DATA>){ print if / cat # word cat (?: # do not capture (?! # negative lookahead \s* # possible whitespace dog # the word dog ) # end negative lookahead ) # end do not capture group /x; # /cat(?:(?!\s*dog))/ } __DATA__ my cat loves dogs catdog cat dog dog dog dog cat dog dog cat not a dog
Output:
my cat loves dogs dog cat not a dog
Note that the above will also match things like cat doggle, so if you *only* want it to match the word "dog", you'll have to put a boundary at the end of that word in the regex.
Update: AnomalousMonk pointed out below that the non-capture portion is not required here. For posterity, I'll leave it in (unless someone advises it'd be best to remove). So essentially, the second and last lines in the regex above are not needed.
In reply to Re: search for 'cat' not followed by 'dog'
by stevieb
in thread search for 'cat' not followed by 'dog'
by b4swine
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |