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

  • 相关阅读:
    Servlet编程实例 续2
    Servlet编程实例 续1
    Servlet编程实例
    Servlet包介绍
    Servlet处理流程分析
    Servlet简介
    初始String
    类对象的定义
    类和对象
    JDBC编程之程序优化
  • 原文地址:https://www.cnblogs.com/huaweicloud/p/11861625.html
Copyright © 2011-2022 走看看