The following regex finds text between substrings FTW and ODP.
/FTW(((?!FTW|ODP).)+)ODP+/
What does the (?!
...)
do?>
From perldoc:
A zero-width negative look-ahead assertion. For example
/foo(?!bar)/
matches any occurrence of "foo
" that isn't followed by "bar
". Note however that look-ahead and look-behind are NOT the same thing. You cannot use this for look-behind.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$/)