作者 | 浩说编程
来源 | 公众号:浩说编程
[ 大厂技术资源 | 研发必备安装包 | 限时免费获取 ]
在我们的日常业务开发中经常会涉及到使用正则表达式对数据进行处理,比如String的Split()方法,它根据方法中传入的正则表达式对字符串做分割处理。
但是我们是否真的了解正则表达式,它是如何匹配的?不同的匹配方式会带来怎样的效率差别?怎样才能做到效率最优?
本篇就对“如何优化正则表达式的匹配效率?”做深入探讨。
一、匹配的三种方式
看下面这个例子,我们给定了一个字符串以及三个功能相同但写法略有区别的正则表达式:
String testStr = "effg";
String regular_1 = "ef{1,3}g";
String regular_2 = "ef{1,3}?g";
String regular_3 = "ef{1,3}+g";
用split方法测试每个正则表达式运行的时间:
List<String> regulars = new ArrayList<>();
regulars.add(regular_1);
regulars.add(regular_2);
regulars.add(regular_3);
for(String regular : regulars){
long start,end;
start = System.currentTimeMillis();
testStr.split(regular);
end = System.currentTimeMillis();
System.out.println((end - start) + "(ms)");
}
控制台输出(为了体现效率差别,测试的时候我将上面的字符串复制成了足够的长度):
2(ms)
1(ms)
0(ms)
可以明显看到,虽然实现了相同的匹配功能,但效率却有所区别,原因在于这三种写法定义了