Java 手机号校验工具类

需求分析

一个合法的中国大陆手机号通常满足以下规则:

  • 长度为 11 位

  • 全部由数字组成

  • 以 1 开头,第二位为 3-9(涵盖现有运营商号段)

  • 后续 9 位为任意数字

工具类实现

java 复制代码
import java.util.regex.Pattern;

public class MobileValidator {

    // 手机号正则:1开头,第二位3-9,后面9位数字,总共11位
    private static final Pattern MOBILE_PATTERN = Pattern.compile("^1[3-9]\\d{9}$");

    /**
     * 手机号校验逻辑
     * @param mobile 待校验的手机号字符串
     * @return 是否合法
     */
    public static boolean validateMobileNumber(String mobile) {
        // 防空及长度校验
        if (mobile == null || mobile.length() != 11) {
            return false;
        }
        // 纯数字校验
        if (!mobile.matches("\\d+")) {
            return false;
        }
        // 正则格式匹配
        return MOBILE_PATTERN.matcher(mobile).matches();
    }
}

校验设计思路

  1. 长度校验

    提前过滤掉长度不为 11 的输入,避免无意义的后续判断。同时增加了 null 判断,防止空指针异常。

  2. 全数字校验

    使用 \\d+ 确保字符串中每一个字符都是数字。该正则等价于 ^[0-9]+$,能有效拦截包含字母、空格或特殊符号的字符串。

  3. 正则匹配
    ^1[3-9]\\d{9}$ 精确描述了 11 位手机号的组成规则:

    • ^1:以数字 1 开头

    • [3-9]:第二位为 3、4、5、6、7、8、9 中的一个

    • \\d{9}:后续 9 位均为数字

    • $:字符串结尾

    只有当长度、纯数字、号段规则全部满足时,才返回 true

main 方法调用演示

java 复制代码
public class MobileValidatorDemo {
    public static void main(String[] args) {
        // 测试用例
        String[] testMobiles = {
                "13812345678",   // 合法
                "15000000000",   // 合法
                "12012345678",   // 第二位为2,不合法
                "12345678901",   // 第二位为2,不合法
                "1381234567",    // 长度不足
                "138123456789",  // 长度超长
                "138abcdefgh",   // 包含字母
                null,            // null
                ""               // 空字符串
        };

        for (String mobile : testMobiles) {
            boolean isValid = MobileValidator.validateMobileNumber(mobile);
            if (isValid) {
                System.out.println("[合法] 手机号: " + mobile);
            } else {
                System.out.println("[不合法] 手机号: " + mobile +
                        " (必须为11位数字且符合中国手机号规则:1开头,第二位3-9)");
            }
        }
    }
}

运行结果:

java 复制代码
[合法] 手机号: 13812345678
[合法] 手机号: 15000000000
[不合法] 手机号: 12012345678 (必须为11位数字且符合中国手机号规则:1开头,第二位3-9)
[不合法] 手机号: 12345678901 (必须为11位数字且符合中国手机号规则:1开头,第二位3-9)
[不合法] 手机号: 1381234567 (必须为11位数字且符合中国手机号规则:1开头,第二位3-9)
[不合法] 手机号: 138123456789 (必须为11位数字且符合中国手机号规则:1开头,第二位3-9)
[不合法] 手机号: 138abcdefgh (必须为11位数字且符合中国手机号规则:1开头,第二位3-9)
[不合法] 手机号: null (必须为11位数字且符合中国手机号规则:1开头,第二位3-9)
[不合法] 手机号:  (必须为11位数字且符合中国手机号规则:1开头,第二位3-9)
相关推荐
何极光19 分钟前
IDEA集成Maven
java·maven·intellij-idea
程序员二叉36 分钟前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉37 分钟前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
老马识途2.044 分钟前
在AI的帮助下理解spring的启动过程
java·前端·spring
青山木1 小时前
Hot 100 --- 轮转数组
java·数据结构·算法
Qt程序员1 小时前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言
code bean2 小时前
【LangChain】检索器完全指南:从向量检索到生产级 RAG 架构
java·开发语言·微服务
大白菜和MySQL2 小时前
java应用排查高线程
java·python
KobeSacre2 小时前
ReentrantLock源码
java
嵌入式协会20240722 小时前
(已解决)MinIO python 获取预签名出现forbidden、errornetwork等错误
java·开发语言·python