1、问题

在浏览项目时,发现一段使用正则表达式的代码

这段代码,在循环里执行了Pattern.matches()方法进行正则匹配判断。
查看matches方法的源码,可以看到

每调用一次matches方法,都会创建一个Pattern对象,而且这段代码还是在for循环里,如果外层函数又被频繁调用,就会出现很明显的性能问题。

创建Pattern实例的成本很高,因为需要将正则表达式编译成一个有限状态机(final state machine)。

2、解决

使用正则表达式的预编译功能,可以有效加快正则匹配速度
显式地将正则表达式编译成一个不可变的Pattern实例,让它成为类初始化的一部分

private static final Pattern TASKID_PATTERN = Pattern.compile("^\\d{1,15}");

最后在函数中使用如下方式调用,就可以避免创建不必要的Pattern实例

3、总结

正则表达式给人的印象是快捷简便。但是在 N.O.P.E 分支中使用正则表达式将是最糟糕的决定。如果万不得已非要在计算密集型代码中使用正则表达式的话,至少要将 Pattern 缓存下来,避免反复编译Pattern

创建Pattern实例的成本很高,因为需要将正则表达式编译成一个有限状态机(final state machine)
显式地将正则表达式编译成一个不可变的Pattern实例,让它成为类初始化的一部分。

【不建议】

// 没有使用预编译
private void func(...) {if (Pattern.matches(regexRule, content)) {...}
}
// 多次预编译
private void func(...) {Pattern pattern = Pattern.compile(regexRule);Matcher m = pattern.matcher(content);if (m.matches()) {...}
}

【建议】

private static final Pattern pattern = Pattern.compile(regexRule);private void func(...) {Matcher m = pattern.matcher(content);if (m.matches()) {...}
}

来源:华为云社区征文 作者:EmindCC

#华为云·寻找黑马程序员#【代码重构之路】使用Pattern的正确姿势相关推荐

  1. 移动端开发语言的未来的猜想#华为云·寻找黑马程序员#

    [摘要] #华为云.寻找黑马程序员# 不管是最早的Phonegap,还是后来的React Native.Weex,Flutter,或者是各个公司自创开发语言,都是在不断寻求开发语言统一,从而解决ios ...

  2. 三伏天里小试牛刀andriod开发 #华为云·寻找黑马程序员#

    三伏天里小试牛刀andriod 开发 #华为云·寻找黑马程序员# 2019年07月,北京,三伏天,好热啊.越热自己还越懒得动换(肉身给的信号),但是做为产品经理/交互设计师的,总想着思考些什么(灵魂上 ...

  3. #华为云·寻找黑马程序员#【代码重构之路】如何“消除”if/else

    1. 背景 if/else是高级编程语言中最基础的功能,虽然 if/else 是必须的,但滥用 if/else,特别是各种大量的if/else嵌套,会对代码的可读性.可维护性造成很大伤害,对于阅读代码 ...

  4. #华为云·寻找黑马程序员#【代码重构之路】如何优雅的关闭外部资源

    1.背景 在Java编程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们.因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在编 ...

  5. #华为云·寻找黑马程序员#【代码重构之路】我是如何将8行代码缩减成1行的

    [摘要]最近公司在大力提倡clean code, 而clean code 不仅是新写的代码要做,老旧的代码也要适当重构,精简我们的代码,毕竟代码还是要给人看的. 个人比较喜欢重构,当然,手术级的重构没 ...

  6. eplices如何导入外部代码_#华为云·寻找黑马程序员#【代码重构之路】如何优雅的关闭外部资源...

    1.背景 在Java编程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们.因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在编 ...

  7. python让你再也不为文章配图与素材发愁,让高清图片占满你的硬盘! #华为云·寻找黑马程序员#

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  8. 大型情感剧集Selenium:1_介绍 #华为云·寻找黑马程序员#

    学习selenium能做什么? 很多书籍.文章中是这么定义selenium的: Selenium 是开源的自动化测试工具,它主要是用于Web 应用程序的自动化测试,不只局限于此,同时支持所有基于web ...

  9. 【带着canvas去流浪(13)】用Three.js制作简易的MARVEL片头动画(下)#华为云·寻找黑马程序员#

    [摘要] three.js实现的Web 3D字体模型动画 示例代码托管在:http://www.github.com/dashnowords/blogs 有了上一篇基础知识的储备,本节就来制作一下简易 ...

最新文章

  1. 使用 IAsyncResult 进行 .NET 异步编程(转载)
  2. MySQL事务隔离级别详解
  3. unix和linux的区别
  4. Linux tmux
  5. Unity Physics.Raycast踩坑
  6. python调用flask接口实例化_常用业务接口界面化 in python flask
  7. jmeter根据循环获取参数_Jmeter--同线程组循环获取数据库数据传递请求
  8. Pychram中如何导入其他文件的.py文件
  9. 关于elastic-job 分片与线程问题
  10. 吐血整理的几十款小程序登陆界面【附完整代码】
  11. 如何免费在线将pdf转换成jpg图片
  12. 佳句赏析_求上者居中,求中者居下,求下者则不入流; 原作者 出处 出自 | 句子迷...
  13. 小米路由器登陆以及切换wan账户脚本
  14. tukey是什么意思_turkey中文是什么意思怎么读(英语里这个TURKEY这个多义词解析)...
  15. 光驱动器类有哪些最新发表的毕业论文呢?
  16. 期货反跟单-千万不要盲目开始反跟单交易
  17. NT Server无盘站配置技术详解
  18. 使用朋也社区搭建自己的社区网站就是这么简单~~
  19. 数字高程模型(DEM)—知识汇总
  20. 语音数据集 | Speech datasets

热门文章

  1. python读取指定行到最后一行_python读取文件最后一行两种方法
  2. python中构造方法的名字,【填空题】Python提供了名称为 的构造方法,实现让类的对象完成初始化。...
  3. 唐尼vr眼镜好吗_裸眼3DVR和全息投影有什么区别 他们之间谁更好一些
  4. POJ3321 Apple tree
  5. 爬虫3 requests基础之 乱码编码问题
  6. javascript遍历json对象数据的方法
  7. Python与自然语言处理搭建环境
  8. 一个字符串排列的小算法
  9. 精通RPM之--制作篇(rpmbuild)
  10. leetcode 42 python