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$/)