首页 > res > literature > Encyclopaedia > > 正文

为什么手机号码都11位?如何正则校验手机号码?区分运营商

发布人:zhoulujun@live.cn    点击:

这里不止是是教你如何写手机正则表达式,关羽手机号码的分组,分组由来,如何识别手机号码,手机号码正则表达式的编写,为何这样编写。一遍由浅入深的文章。欢迎大家评论!


目前短信平台支持的短信号段如下

 

运营商

号段

移动

134135136137138139147150151152154157, 158, 159, 182, 183, 184, 187, 188, 178, 1703, 1705, 1706

联通

130131132155156185186145171175176170917071708

电信

133153180181189173177170017011702

 170开头的都是虚拟运营商



目前,我国使用的手机号码为11位,其中各段有不同的编码方向: 前3位———网络识别号;
第4-7位———地区编码;(所以把你的号码前7位放到度娘搜索就知道哪个城市)
第8-11位———用户号码。
经过划分,目前以“13”打头的号码段已全部发放完毕,联通占3个子号段,由130至132号段,133号段为电信手机号段;而中国移动则占有其余6个子号段,即由134至139号段。按照电信号码使用的原则,一般达到理论容量的50%,即意味着号码资源利用率接近饱和了。按照中国移动现有6个号段分析,移动的用户号码容量实际上限应该在3亿左右;而联通的上限在2亿上下。而电信的上限在1亿上下。(数据只算13开头的)

电信 (中国电信+中国卫通)·

中国电信手机号码开头数字
2G/3G号段(CDMA2000网络)133、153、180、181、189
4G号段 177

联通 (中国联通+中国网通)

中国联通手机号码开头数字
2G号段(GSM网络)130、131、132、155、156
3G上网卡145
3G号段(WCDMA网络)185、186
4G号段 176、185[1]

移动 (中国移动+中国铁通)

中国移动手机号码开头数字
2G号段(GSM网络)有134x(0-8)、135、136、137、138、139、150、151、152、158、159、182、183、184。
3G号段(TD-SCDMA网络)有157、187、188
3G上网卡 147
4G号段 178


国内的手机号码,是由国家信息产业部统一规划的。原来是10位,由于用户的不断增长,10位的号码不够使用,于是升为11位。
至于为什么是11位,一方面是由号码格式决定的,另一方面,就是上面说的号码段容量问题。
现在的手机号码格式是 3位网号+4位HLR号+4位的个人代码,这样的配置既能够最大程度的利用号码资源,不至于浪费,又能够在各运营商各地区之间进行灵活分配。
中国的手机号码目前是11位,是世界上最长的电话号码,为什么是11位呢,原因很简单
因为一个11位数的组合数一共有千亿个号码。而且即便除去头两位的“13”剩下9位数,而一个9位数的组合数也就是从13000000000——13999999999一共可以容纳10亿个不同的号码,中国才多少人?10来亿人,电话普及率还没达到100%吧,所以完全够用。即便到未来普及率到100%或者一人两个电话的时候,我们把首位的“1”固定下来,第二位换一个数字就又增加10亿个号码的容量。
既然对于我们这个人口巨型的大国来说这点电话号码就够用了,世界上哪个国家有我们的人口多?呵呵,所以他们都没有这么长的电话号码


中国大陆地区
13*####$$$$
这就是格式.
*号是区分不同业务服务商的像移动和联通.
提供前7位也就是13*####就可以在查出手机归属地!
$$$$是用户流水号
怎么看出手机号是什么地方的
手机号码前七位是号段,后四位随机分配,所以主要关注手机号码的前七位就可以了。
而这前七位数字里,前面的三位数字是网段,比如130、133、139等,这跟手机号码所在地没有关系,因此如何判断手机号码归属地,主要就看第4位到第7位这中间的四位数字。
如何从这四位判断手机归属地呢?
在移动电话开始投入使用初期,手机号码是10位数,举个典型的例子就是1394518888这个号码,中间的“451”其实就是各地的长途区号,即哈尔滨市。后来在1999年11月进行电话号码升位,统一在第三位数字后添加一个数字“0”,就变成了现在的13904518888。
而判断手机号码归属地,就变成了根据电话区号判断是哪个城市了,如果你对全国的长途电话区号比较熟,就有利于你判断手机号码的归属地了,比如0351-0370属于山西地区、0451-0470属于黑龙江地区、0550-0569属于安徽地区等等。这样的话,手机号中间四位如果是0打头的就比较好判断。


不过现在随着手机用户的越来越多,一些没有规则的号段也逐渐放出,比如1358192xxxx属于北京地区等等,这就需要你到网上查询详细的号段分配了。
疑问一:“废弃”的号码哪里去了?
目前我国从134到139的号段为中国移动所得,联通用户的号码则以130到133开头。为了缓解号码资源紧张状况,运营商对于久不使用的“休眠号”,以及销户号码采取“重启”方式处理。
疑问二:号段为什么不断增加?
这主要是由于用户数量的增加引起的,每一个号段都会有一定的容量,比如139开头的11位数号段,其容量是1亿用户。按照电信号码使用的原则,一般达到理论容量的50%即意味着号码资源利用率接近饱和了。
疑问三:号段的选择有什么讲究?

各个不同的频段应用于各个不同的通信领域,大家熟悉的13开头的频段主要应用于移动通信;而我们所不了解的号段,有的应用于点对点通信(比如警察对讲机)或者特殊的通信领域




从以上我们可以看到第一位是【1】开头,第二位则则有【3,4,5,7,8】,第三位则是【0-9】,第三位之后则是数字【0-9】。从而我们可以得出一个符合当前的手机号码验证正则表达式。

var reg = /^1(3|4|5|7|8][0-9){9}$/; //验证规则 或者
var reg= ^1[34578]\d{9}$  推荐后者

var phoneNum = '15507621999';//手机号码

var flag = reg.test(phoneNum); //true

但你想过没有,也许这个第二位代码可能随时增加一个,比如以16开头呢?19开头呢?谁知道以后的事,咱们的代码要保证几年没问题,所以还可以不验证第二位规则:·

reg = /^1[0-9]{10}$/;


但是 ,很多朋友会写成:

/^1[3|4|5|7|8][0-9]{9}$/
/^1[3|4|5|7|8][0-9]{9}$/.test('1|222222222') //true

这里温习下圆括号的用法:

1.正则表达式中的圆括号的作用是对字符进行分组,并保存匹配的文本。


2.圆括号用法I:对字符或元字符进行分组,这样在圆括号内就可以对字符组合使用限定符。


    eg. 匹配A+一个数字+A+一个数字:(A\d){2}


3.圆括号用法II:表示可选择性。


    3.1 从两个直接量中选择一个


       eg. gr(a|e)y匹配gray和grey,该例子还可以使用gr[ae]y,字符类效率更高。


    3.2 从多个直接量中选择


       eg. (Doctor|Dr\.?)匹配Doctor,Dr,Dr.三种情况


    3.3 错误匹配的交替行为,


       使用交替行为时,有时会出现意想不到的错误。


       eg. 用(a|ab)匹配ab时,只能匹配a,但是如果用(ab|a),则可以匹配ab


4.捕获圆括号:正则表达式中,与位于圆括号之间的模式匹配的内容都会被捕获。


    4.1 当模式中有嵌套的圆括号时,变量的编号会按照圆开括号出现的位置一次进行。


    eg. ([A-Za-z](\d{2}))((-)\d{2})匹配”A22-33”时,匹配情况如下:


Group 1:   A22


Group 2:   22


Group 3:   -33


Group 4:   -


    4.2 .NET中,可以创建命名的组,语法为:


       (?


       eg. (?


        Group "FirstLetter": A22


Group "Num":  22


Group 1:   -33


Group 2:   -


    4.3 非捕获的圆括号:.NET和JavaScript都提供了非捕获圆括号的功能,即圆括号的内容不作为捕获对象,当圆括号中的内容不是想捕获的对象时,采用非捕获圆括号可以提高匹配效率。语法为:


       (?:the-non-captured-content)


       eg. (\w(?:\d{2}))((?:-)\d{2})匹配” A22-33”情况如下:


        Group 1:   A22


Group 2:   -33


注:\d{2}匹配的”22”没有被捕获


5.反向引用(backreferences)


    语法:.NET和JavaScript中,表示匹配第一组的变量被指定为”\1”


    能够体现反向引用的便利性的一种情况是找到句子中重复的单词。


    eg. 查找下列句子中重复的单词:


I think that that is often overdone.


This sentence contains contains a doubled word or two two.


我们用([A-Za-z]+) +\1\b来匹配,红色部分为匹配的结果


       在这个匹配模式中([A-Za-z]+)为匹配的第一组变量,后面加一个或多个空格( +)表示单词间隔,


       然后用”\1”来表示第一组匹配的变量(即[A-Za-z]+匹配的内容),最后一个表示单词的结束(\b)



附带正则表达式:

提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F)  *=  *('|")?(\w|\\|\/|\.)+('|"|  *|>)?   

提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*   

提取信息中的图片链接:(s|S)(r|R)(c|C)  *=  *('|")?(\w|\\|\/|\.)+('|"|  *|>)? 

提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)     

提取信息中的中国手机号码:(86)*0*13\d{9}     

提取信息中的中国固定电话号码:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}     

提取信息中的中国电话号码(包括移动和固定电话):(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}     

提取信息中的中国邮政编码:[1-9]{1}(\d+){5}     

提取信息中的中国身份证号码:\d{18}|\d{15}     

提取信息中的整数:\d+     

提取信息中的浮点数(即小数):(-?\d*)\.?\d+     

提取信息中的任何数字  :(-?\d*)(\.\d+)?   

提取信息中的中文字符串:[\u4e00-\u9fa5]*     

提取信息中的双字节字符串  (汉字):[^\x00-\xff]*


参考文章:

https://www.zhihu.com/question/19765957/answer/40597226

http://caibaojian.com/phone-regexp.html

正则表达式学习笔记(5)正则表达式中的圆括号