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

  • 相关阅读:
    20170809--JS操作Select备忘
    20160711--C# 委托的三种调用示例(同步调用 异步调用 异步回调)【转载】
    C# 内存建表备忘
    富文本编辑器 CKeditor 配置使用
    20160520—JS打分控件
    20160513--js 弹出窗口带有iframe控件 备忘
    chart 简单应用
    mvc 简单整理
    ObjectDatasourse 的绑定及显示
    GridView 详述
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165652.html
Copyright © 2020-2023  润新知