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

  • 相关阅读:
    PowerShell(0)Windows PowerShell交互界面
    WIN8的特性
    利用笔记本的WiFi做AP共享网络
    MD5和SHA加密测试
    WMI操作示例
    购买Microsoft Technet订阅,免费获得微软几乎所有的产品序列号“用于评估”,
    une petite bébé
    为ESX5主机配置多路径共享存储(以MD3000I为例)
    获取网卡信息
    CISCO交换机端口回环的处理方法备忘
  • 原文地址:https://www.cnblogs.com/huaweicloud/p/11861629.html
Copyright © 2011-2022 走看看