I could, but I think that perldoc perlre can give a better explanation:
(?!pattern)
A zero-width negative lookahead assertion. For
example /foo(?!bar)/ matches any occurrence of
"foo" that isn't followed by "bar". Note however
that lookahead and lookbehind are NOT the same
thing. You cannot use this for lookbehind.
If you are looking for a "bar" that isn't preceded
by a "foo", /(?!foo)bar/ will not do what you
want. That's because the (?!foo) is just saying
that the next thing cannot be "foo"--and it's not,
it's a "bar", so "foobar" will match. You would
have to do something like /(?!foo)...bar/ for
that. We say "like" because there's the case of
your "bar" not having three characters before it.
You could cover that this way:
/(?:(?!foo)...|^.{0,2})bar/. Sometimes it's still
easier just to say:
if (/bar/ && $` !~ /foo$/)
Cheers,
Shendal
|