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

posted @   华为云官方博客  阅读(86)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示