在应用中验证电话号码是一个常见的功能,而电话号码包括手机号码和座机号码。今天写这个正则表达式写了比较久,记录在这里,以备后用。本文的一个基本假设:手机号码都是11位,座机号码加上区号也是11位

先科普一下座机区号的规则:点击科普。这是网易博客的一篇博文,简单说来座机区号是历史的产物,我也是看了这里才知道个大概。总结起来我认为可以归纳为这样:北京区号010,后面8位数;其他地区以以0为首位,2~9位次位,其余位为0~9。因此总结起来正则式应该是这样:

(010\d{8})|(0[2-9]\d{9})

而手机号则不一样了,手机号的号段不固定,目前能查阅到的运营商号段见下图:

wKioL1RlubHyBnMYAADFoECuQHo018.jpg

观察可以发现13*系列号段是齐全的,而14开头的只有145、147两个号段,15和18号段除了缺失154、184之外也是齐全的。因此正则表达式列出如下:

(13\d{9})|(14[57]\d{8})|(15[0-35-9]\d{8})|(18[0-35-9]\d{8})

两者连接起来可以验证手机和座机号码,如下:

(010\d{8})|(0[2-9]\d{9})|(13\d{9})|(14[57]\d{8})|(15[0-35-9]\d{8})|(18[0-35-9]\d{8})

上述式子经过在线测试工具初步测试通过,如图:

wKiom1RlvgHhWfqxAADCzjD2j1k324.jpg

这个表达式写得有些长,如果有更简洁的写法还请各位不吝赐教,谢谢!