• #华为云·寻找黑马程序员#【代码重构之路】使用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

  • 相关阅读:
    linux read的用法[转]
    1>/dev/null 2>&1的含义
    文件的权限
    【原创】server 10.192.242.184 not responding, still trying
    git使用中遇到的错误及解决方法
    linux中mmu作用的简单总结(未完)
    python版本设置
    【转】buntu TELNET服务安装配置
    【转】进程上下文和中断上下文、原子上下文的区别
    【转】【Linux】理解bitops中的__set_bit及其应用
  • 原文地址:https://www.cnblogs.com/huaweicloud/p/11861629.html
Copyright © 2020-2023  润新知