zoukankan      html  css  js  c++  java
  • #华为云·寻找黑马程序员#【代码重构之路】使用Pattern的正确姿势

    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

  • 相关阅读:
    我今天能懂
    SpringMVC之RequestContextHolder分析
    idea只导入部分依赖
    idea中GitPush失败问题
    SpringBoot常用配置,引入外部配置文件信息,热加载
    idea的yml文件不识别问题
    SpringBoot介绍,快速入门小例子,目录结构,不同的启动方式,SpringBoot常用注解
    Java连接Redis,存储对象获取对象()byte和json),连接池
    Nginx的反向代理
    Nginx介绍,安装,配置
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165648.html
Copyright © 2011-2022 走看看