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

时间:2011-03-23 15:26:00

标签: java regex string

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

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

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

String.replace()方式:

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

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

是否有比上述两种更有效的方式?

5 个答案:

答案 0 :(得分:12)

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

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

是否有比上述两种更有效的方式?

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

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

答案 1 :(得分:2)

这是来自openjdk的source code

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

答案 2 :(得分:1)

使用string数组或其他一些可变类型(例如StringBufferchar),而不是使用不可变的StringBuilder

答案 3 :(得分:1)

没有进行任何分析或基准测试,我会说这是一个相当安全的选择,如果你不需要正则表达式魔法,那么正则表达式解析器的开销(无论如何,你都会得到,就其而言内存以及CPU使用率)比你在另一端可能获得的成本高得多。

答案 4 :(得分:0)

你不应该比较replaceAll 2次吗?但是,对于单个调用,它几乎不可测量。你会做数百万次比较吗?

然后我希望'compile'更快,但只有,如果你不使用没有任何模式规则的常量字符串。

编写微基准的问题在哪里?或者查看源代码。