How to Replace the String Between Two Characters in Java

Published Aug 18, 2021

Replacing specific characters in a string is quite easy in Java (using replace()), but how can we replace an entire substring between two characters?

Suppose we have a string that is meant to represent a URL path.

String url = "/path/{id}/resource";

Let’s say we want to replace the string between the opening and closing curly braces {} with an asterisk *.

String updatedUrl = "/path/*/resource";

Using replaceAll()

We can do this using replaceAll().

The first parameter takes in a regular expression while the second takes in a string with the replacement value.

String start = "\\{";
String end = "\\}";
String updatedUrl = url.replaceAll(start + ".*" + end, "*");

Our start and end symbols need to be escaped if they are special characters used in regular expressions.

In Java, these characters will need to be escaped: \.[]{}()<>*+-=!?^$|.

In order to escape a special character, we can add the a single backslash \, or the escape character, before the special character.

However, we also need to escape that backslash with the escape character (hint: another backslash), since it too is a special character.

This is why we will often see double backslashes \\ in regular expressions.

This string \\{.*\\} translates to the sequence \{.*\}, which literally matches our url against {.*}.

Greediness

While this is a great start to using regular expressions in our replaceAll() method, we’ll have to deal with the greediness of our matching.

This relates to the .* portion of the regular expression.

GreedyReluctantPossessiveMeaning
X?X??X?+X, once or not at all
X*X*?X*+X, zero or more times
X+X+?X++X, one or more times
X{n}X{n}?X{n}+X, exactly n times
X{n,}X{n,}?X{n,}+X, at least n times
X{n,m}X{n,m}?X{n,m}+X, at least n but not more than m times

Based on our use case, we can vary our greedy quantifiers to match as little or as much as we need.


More Java Articles