需求分析
一个合法的中国大陆手机号通常满足以下规则:
-
长度为 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();
}
}
校验设计思路
-
长度校验
提前过滤掉长度不为 11 的输入,避免无意义的后续判断。同时增加了
null判断,防止空指针异常。 -
全数字校验
使用
\\d+确保字符串中每一个字符都是数字。该正则等价于^[0-9]+$,能有效拦截包含字母、空格或特殊符号的字符串。 -
正则匹配
^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)