比较不同正则表达式的性能,需要澄清

时间:2012-02-06 03:32:37

标签: java regex

考虑3个正则表达式,旨在从字符串中删除非拉丁字符。

    String x = "some†¥¥¶¶ˆ˚˚word";

    long now = System.nanoTime();
    System.out.println(x.replaceAll("[^a-zA-Z]", ""));     // 5ms
    System.out.println(System.nanoTime() - now);

    now = System.nanoTime();
    System.out.println(x.replaceAll("[^a-zA-Z]+", ""));    // 2ms
    System.out.println(System.nanoTime() - now);

    now = System.nanoTime();
    System.out.println(x.replaceAll("[^a-zA-Z]*", ""));    // <1ms
    System.out.println(System.nanoTime() - now);

所有3个产生相同的结果,性能指标差别很大。

为什么?

2 个答案:

答案 0 :(得分:1)

第一个较慢,因为正则表达式分别匹配每个非拉丁字符,因此replaceAll分别对每个字符进行操作。

其他模式匹配整个非拉丁字符序列,因此replaceAll可以一次性替换整个序列。但是,我无法解释这两者之间的性能差异。可能与正则表达式引擎中处理*+的差异有关。

答案 1 :(得分:1)

最后一个将用空字符串替换空字符串(除非那是优化的,我不知道编译器)这似乎有点不必要......; - )

如果非拉丁字符是adjecent,第一个搜索的次数会比第二次搜索的次数多得多。否则不是。所以我猜1和2的时间在某些文本上可能大致相同,而在其他文本中则为1。