java中string.matches()校验手机号时默认全匹配,正则应写为"1[3-9]d{9}",需先trim()并移除非数字字符再校验,避免冗余锚点、误用量词及未判空导致异常。

Java 中 String.matches() 可以直接用正则表达式校验手机号,但要注意:它默认要求**整个字符串完全匹配**(即隐含 ^ 和 $),所以写正则时不用额外加首尾锚点。
中国大陆手机号的基本规则
常见合法格式为 11 位数字,且首位必须是 1,第二位通常是 3–9(排除 10、11、12 等无效号段)。主流号段包括:
- 13x、14x(部分)、15x、17x、18x、19x
- 注意:144、147、148 等属于虚拟运营商号段,149 属于物联网卡,实际业务中是否接受需按需判断
- 不考虑携号转网带来的号段交叉,仅做基础格式校验
推荐的正则表达式写法
使用简洁、可读性强且覆盖主流号段的正则:
String regex = "1[3-9]\d{9}";
说明:
-
1:第一位固定为 1 -
[3-9]:第二位为 3 到 9(排除 10–12 等非法号段) -
\d{9}:后面连续 9 位任意数字,合起来共 11 位
调用示例:
String phone = "13812345678";
boolean isValid = phone.matches("1[3-9]\d{9}"); // true
增强健壮性的注意事项
用户输入常带空格、短横线或括号(如 "138-1234-5678" 或 " 13812345678 "),直接 matches 会失败。建议先清洗再校验:
- 用
phone.trim().replaceAll("[^\d]", "")去掉所有非数字字符并去首尾空格 - 再对清洗后的字符串做
matches("1[3-9]\d{9}") - 可额外加长度判断(如清洗后不是 11 位,直接返回 false)提升效率
避免常见错误
以下写法容易出错,需避开:
-
"^1[3-9]\d{9}$":matches 已自动全匹配,加 ^ 和 $ 是冗余,虽不影响结果但易误导 -
"1[3-9]{9}":误写成第二位重复 9 次,实际应是第二位 1 位 + 后续 9 位数字 -
"1[3-9]\d+":+ 表示 1 次或多次,会导致 12 位甚至更长也通过(如"138123456789") - 忽略 null 或空字符串:调用前应先判空,否则抛
NullPointerException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











