跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

如何利用“字符集缩写”构建极其简练的原始移动电话号码正则校验器

最简正则表达式为^1[3-9]\d{9}$:^和$锚定首尾,1匹配首位,[3-9]限定第二位为3–9,\d{9}表示后9位全数字,避免误判非实名号段。 直接用字符集缩写(如
\d
)替代冗长的
[0-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 和字符组缩写写出最简模式 原始写法:
^1[3-9]\d{9}$
说明:
^
和
$
锚定首尾,确保整个字符串完全匹配,防止“13812345678abc”这类混入内容误判
1
字面量匹配第一位
[3-9]
是字符集缩写形式,比
[345789]
更紧凑,且语义清晰(3到9之间的单个数字)
\d{9}
是关键简化:
\d
等价于
[0-9]
,
{9}
表示紧接其后的数字重复9次;比写成
\d\d\d\d\d\d\d\d\d
或
[0-9][0-9]...[0-9]
(9次)简洁得多 避开常见缩写误用陷阱 看似更短的写法如
^1\d{10}$
不可靠,原因: 它允许第二位为
0
、
1
、
2
,而这些号段从未分配给公众手机号 无法排除140、141、142、170、171等非实名制或已冻结号段(虽然技术上属11位,但业务上不视为“正规移动号码”) 若需兼容极少数新开放号段(如19x),应显式扩展字符组,例如
[3-9]|19
→ 改为
^1(?:[3-9]|19)\d{8}$
,但此时已超出“极其简练”范畴 一行即用的验证示例(Python) import redef is_valid_mobile(s):return bool(re.fullmatch(r'^1[3-9]\d{9}$', s)) 注意使用
re.fullmatch
(Python 3.4+)而非
re.match
,它自动隐含
^
和
$
,语义更干净;若用旧版,保持
re.match(r'^1[3-9]\d{9}$', s)
即可。

相关文章