#华为云·寻找黑马程序员#【代码重构之路】使用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()) {
        ...
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值