考虑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个产生相同的结果,性能指标差别很大。
为什么?
答案 0 :(得分:1)
第一个较慢,因为正则表达式分别匹配每个非拉丁字符,因此replaceAll
分别对每个字符进行操作。
其他模式匹配整个非拉丁字符序列,因此replaceAll
可以一次性替换整个序列。但是,我无法解释这两者之间的性能差异。可能与正则表达式引擎中处理*
和+
的差异有关。
答案 1 :(得分:1)
最后一个将用空字符串替换空字符串(除非那是优化的,我不知道编译器)这似乎有点不必要......; - )
如果非拉丁字符是adjecent,第一个搜索的次数会比第二次搜索的次数多得多。否则不是。所以我猜1和2的时间在某些文本上可能大致相同,而在其他文本中则为1。