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