How to Replace the String Between Two Characters in Java
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.
| Greedy | Reluctant | Possessive | Meaning |
|---|---|---|---|
| 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.