Try:
/(?!.*bar)(?=.*foo)^(\w+)$/
Tests:
blahfooblah
blahfooblahbarfail
somethingfoo
shouldbarfooshouldfail
barfoofail
Regular expression explanation
NODE EXPLANATION
(?! look ahead to see if there is not:
.* any character except \n (0 or more times
(matching the most amount possible))
bar 'bar'
) end of look-ahead
(?= look ahead to see if there is:
.* any character except \n (0 or more times
(matching the most amount possible))
foo 'foo'
) end of look-ahead
^ the beginning of the string
( group and capture to \1:
\w+ word characters (a-z, A-Z, 0-9, _) (1 or
more times (matching the most amount
possible))
) end of \1
$ before an optional \n, and the end of the
string
Other regex
If you only want to exclude bar
when it is directly after foo
, you can use
/(?!.*foobar)(?=.*foo)^(\w+)$/
Edit
You made an update to your question to make it specific.
/(?=.*foo(?!bar))^(\w+)$/
New tests
fooshouldbarpass
butnotfoobarfail
fooshouldpassevenwithfoobar
nofuuhere
New explanation
(?=.*foo(?!bar))
ensures a foo
is found but is not followed directly bar