I know of two ways of replacing all occurrences of substring in a string.
The regex way (assuming "substring-to-be-replaced" doesn't include regex special chars):
String regex = "substring-to-be-replaced" + "+";
Pattern scriptPattern = Pattern.compile(regex);
Matcher matcher = scriptPattern.matcher(originalstring);
newstring = matcher.replaceAll("replacement-substring");
The String.replace() way:
newstring = originalstring.replace("substring-to-be-replaced", "replacement-substring");
Which of the two is more efficient (and why)?
Are there more efficient ways than the above described two?
String.replace()
uses regex underneath.
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL)
.matcher(this ).replaceAll(
Matcher.quoteReplacement(replacement.toString()));
}
Are there more efficient ways than the above described two?
There are given that you operate on an implementation backed e.g., by an array, rather than the immutable String class (since string.replace
creates a new string on each invocation). See for instance StringBuilder.replace().
Compiling a regex incurs quite alot of overhead which is clear when observing the Pattern source code. Luckily, Apache offers an alternative approach in StringUtils.replace()
which according to the source code (line #3732) is quite efficient.
Here's the source code from openjdk:
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
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