哪个更快? \ s vs \ s +

时间:2015-12-19 18:17:12

标签: java regex

一个简单的问题我主要是在Java中处理正则表达式的速度。

虽然我知道很可能差别很小,但仍然很有趣。

对于某些字符串,例如"test test test test ",哪个操作会更快: string.replaceAll("\\s", "");string.replaceAll("\\s+", "");

第一个操作的正则表达式不那么复杂,但更换次数更多,第二次反之亦然。

哪个会(非常轻微地)更快?

2 个答案:

答案 0 :(得分:3)

使用 \\ s + 正则表达式将是更快的方法

对于25个固定长度的字符串, 1000000 迭代需要 -

 \\s = 1850479750 nano second
\\s+ = 1206349361 nano second

但是为了获得更好的性能,如果需要在多个替换操作中使用相同的模式,则应该编译模式一次然后使用模式对象

  Pattern p = Pattern.compile("\\s+");

否则每次都是 调用String.replaceAll(),它在每次调用中执行相同的模式编译 -

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

答案 1 :(得分:2)

\ s +的效率在时间和空间复杂性方面会更好,因为:

  1. \ s搜索第一个空格并将后续字符移开。
  2. 然后检查下一个位置并找到一个新空格并重复步骤1.
  3. \ s +一次检查所有连续的空格并立即移动所有字符n(连续空格的数量),从而降低复杂性