最简正则表达式为^1[3-9]\d{9}$:^和$锚定首尾,1匹配首位,[3-9]限定第二位为3–9,\d{9}表示后9位全数字,避免误判非实名号段。
直接用字符集缩写(如
)替代冗长的
,能大幅压缩正则长度、提升可读性与维护性。国内11位手机号校验的核心逻辑是:以1开头,第二位限定为3–9,后9位全数字——这三步完全可用缩写高效表达。
明确手机号结构约束
合法中国大陆手机号必须满足:
总长度严格为11位
首位固定为
1
第二位只能是
3、4、5、7、8、9
(注意:已剔除早期已停用的140/141/142及170/171等虚拟号段中部分不开放号段,按当前主流运营商实际发放规则,保留14[57]、17[13678]等有效组合)
后续9位全部为数字,无空格、横线、括号等分隔符
用 \d 和字符组缩写写出最简模式
原始写法:
说明:
和
锚定首尾,确保整个字符串完全匹配,防止“13812345678abc”这类混入内容误判
字面量匹配第一位
是字符集缩写形式,比
更紧凑,且语义清晰(3到9之间的单个数字)
是关键简化:
等价于
,
表示紧接其后的数字重复9次;比写成
或
(9次)简洁得多
避开常见缩写误用陷阱
看似更短的写法如
不可靠,原因:
它允许第二位为
、
、
,而这些号段从未分配给公众手机号
无法排除140、141、142、170、171等非实名制或已冻结号段(虽然技术上属11位,但业务上不视为“正规移动号码”)
若需兼容极少数新开放号段(如19x),应显式扩展字符组,例如
→ 改为
,但此时已超出“极其简练”范畴
一行即用的验证示例(Python)
import redef is_valid_mobile(s):return bool(re.fullmatch(r'^1[3-9]\d{9}$', s))
注意使用
(Python 3.4+)而非
,它自动隐含
和
,语义更干净;若用旧版,保持
即可。
\d[0-9]^1[3-9]\d{9}$^$1[3-9][345789]\d{9}\d[0-9]{9}\d\d\d\d\d\d\d\d\d[0-9][0-9]...[0-9]^1\d{10}$012[3-9]|19^1(?:[3-9]|19)\d{8}$re.fullmatchre.match^$re.match(r'^1[3-9]\d{9}$', s)