替换字符串中所有出现的子字符串 - 这在Java中更有效?

2022-09-04 19:44:09

我知道有两种方法可以替换字符串中所有出现的子字符串。

正则表达式方式(假设“要替换的子字符串”不包括正则表达式特殊字符):

String regex = "substring-to-be-replaced" + "+";
Pattern scriptPattern = Pattern.compile(regex);
Matcher matcher = scriptPattern.matcher(originalstring);
newstring = matcher.replaceAll("replacement-substring");

The String.replace() 方式:

newstring = originalstring.replace("substring-to-be-replaced", "replacement-substring");

两者中哪一个更有效(为什么)?

有没有比上述两种更有效的方法?


答案 1

String.replace() 在下面使用正则表达式。

public String replace(CharSequence target, CharSequence replacement) {
      return Pattern.compile(target.toString(), Pattern.LITERAL)
             .matcher(this ).replaceAll(
               Matcher.quoteReplacement(replacement.toString()));
  }

有没有比上述两种更有效的方法?

假设您操作的实现由数组支持,而不是不可变的 String 类(因为每次调用都会创建一个新字符串)。例如,请参阅 StringBuilder.replace()string.replace

编译正则表达式会产生相当多的开销,这在观察 Pattern 源代码时很明显。幸运的是,Apache在StringUtils.replace()中提供了另一种方法,根据源代码(第3732行)非常有效。


答案 2

这是来自openjdk的源代码

public String replace(CharSequence target, CharSequence replacement) {
    return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
       this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}