Java regex: Negative lookahead

Try

String regex = "/foo/(?!.*bar).+";

or possibly

String regex = "/foo/(?!.*\\bbar\\b).+";

to avoid failures on paths like /foo/baz/crowbars which I assume you do want that regex to match.

Explanation: (without the double backslashes required by Java strings)

/foo/ # Match "/foo/"
(?!   # Assert that it's impossible to match the following regex here:
 .*   #   any number of characters
 \b   #   followed by a word boundary
 bar  #   followed by "bar"
 \b   #   followed by a word boundary.
)     # End of lookahead assertion
.+    # Match one or more characters

\b, the “word boundary anchor”, matches the empty space between an alphanumeric character and a non-alphanumeric character (or between the start/end of the string and an alnum character). Therefore, it matches before the b or after the r in "bar", but it fails to match between w and b in "crowbar".

Protip: Take a look at http://www.regular-expressions.info – a great regex tutorial.

Leave a Comment