首頁 > res > literature > Encyclopaedia > > 正文

為什么手機號碼都11位?如何正則校驗手機號碼?區分運營商

發布人:[email protected]    點擊:

這里不止是是教你如何寫手機正則表達式,關羽手機號碼的分組,分組由來,如何識別手機號碼,手機號碼正則表達式的編寫,為何這樣編寫。一遍由淺入深的文章。歡迎大家評論!


目前短信平臺支持的短信號段如下

 

運營商

號段

移動

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)正則表達式中的圓括號