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

考虑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个产生相同的结果,性能指标差别很大.

这是为什么?

最佳答案 第一个较慢,因为正则表达式单独匹配每个非拉丁字符,因此replaceAll分别对每个字符进行操作.

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

点赞