With regex in Java, I want to write a regex that will match if and only if the pattern is not preceded by certain characters. For example:
String s = "foobar barbar beachbar crowbar bar ";  I want to match if bar is not preceded by foo. So output would be:
barbar beachbar crowbar bar 
                i) makes the regex case insensitive. (? s) for "single line mode" makes the dot match all characters, including line breaks.
To match any character except a list of excluded characters, put the excluded charaters between [^ and ] . The caret ^ must immediately follow the [ or else it stands for just itself. The character '. ' (period) is a metacharacter (it sometimes has a special meaning).
\\. matches the literal character . . the first backslash is interpreted as an escape character by the Emacs string reader, which combined with the second backslash, inserts a literal backslash character into the string being read. the regular expression engine receives the string \.
Simply put: \b allows you to perform a “whole words only” search using a regular expression in the form of \bword\b. A “word character” is a character that can be used to form words. All characters that are not “word characters” are “non-word characters”.
You want to use negative lookbehind like this: 
\w*(?<!foo)bar   Where (?<!x) means "only if it doesn't have "x" before this point".
See Regular Expressions - Lookaround for more information.
Edit: added the \w* to capture the characters before (e.g. "beach").
Another option is to first match optional word characters followed by bar, and when that has matched check what is directly to the left is not foobar.
The lookbehind assertion will run after matching bar first.
\w*bar(?<!foobar)  \w* Match 0+ word charactersbar Match literally(?<!foobar) Negative lookbehind, assert from the current position foobar is not directly to the left.Regex demo
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With