最新手機號碼正則表達式

最近項目需要本地檢測手機號碼正確性黎茎,于是用了一段代碼,但是后來發(fā)現(xiàn)這個代碼塊已經過時了续徽。在網上簡單找了下,發(fā)現(xiàn)沒有最新的一個公開代碼亲澡,可能很多人都是用的下面正則方法來檢測手機號碼钦扭,那你們該更新代碼了。眾所周知床绪,三大運營商已經增加了不少手機號碼字段土全,還用之前的代碼就會流失部分用戶了捎琐。(只討論國內壞境)

于是我在網上查了些數據,在之前的代碼基礎上改了下裹匙,方便適用于現(xiàn)在的環(huán)境。

所用方法依然還是正則表達式末秃,正則表達式主要就是用一個公式來匹配字符串是否具備某類規(guī)則。我們這里的思路和之前也是一樣,只是對之前方法的一個補充與解析留搔。新的方法只匹配了手機號碼字段前三位译红,有些朋友可能還不太懂這個方法,為了方便大家使用铃将,在最后會為大家簡單拆分該方法项鬼,相信大家很快就會靈活應用了。

舊的正則表達式代碼:

- (BOOL)isMobileNumber:(NSString *)mobileNum
{
    /**
     * 手機號碼
     * 移動:134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188
     * 聯(lián)通:130,131,132,145,152,155,156,1709,171,176,185,186
     * 電信:133,134,153,1700,177,180,181,189
     */
    NSString * MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|7[01678]|8[0-9])\\d{8}$";
    /**
     * 中國移動:China Mobile
     * 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188
     */
    NSString * CM = @"^1(3[4-9]|4[7]|5[0-27-9]|7[0]|7[8]|8[2-478])\\d{8}$";
    /**
     * 中國聯(lián)通:China Unicom
     * 130,131,132,145,152,155,156,1709,171,176,185,186
     */
    NSString * CU = @"^1(3[0-2]|4[5]|5[56]|709|7[1]|7[6]|8[56])\\d{8}$";
    /**
     * 中國電信:China Telecom
     * 133,134,153,1700,177,180,181,189
     */
    NSString * CT = @"^1(3[34]|53|77|700|8[019])\\d{8}$";
    /**
     * 大陸地區(qū)固話及小靈通
     * 區(qū)號:010,020,021,022,023,024,025,027,028,029
     * 號碼:七位或八位
     */
    // NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";
    
    NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
    NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
    NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
    NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
    
    if (([regextestmobile evaluateWithObject:mobileNum] == YES)
        || ([regextestcm evaluateWithObject:mobileNum] == YES)
        || ([regextestct evaluateWithObject:mobileNum] == YES)
        || ([regextestcu evaluateWithObject:mobileNum] == YES))
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

新版正則表達式代碼:

+ (BOOL)isMobileNumber:(NSString *)mobileNum
{
    if (mobileNum.length != 11)
    {
        return NO;
    }
    /**
     * 手機號碼: 
     * 13[0-9], 14[5,7, 9], 15[0, 1, 2, 3, 5, 6, 7, 8, 9], 17[0-9], 18[0-9]
     * 移動號段: 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188
     * 聯(lián)通號段: 130,131,132,145,155,156,170,171,175,176,185,186
     * 電信號段: 133,149,153,170,173,177,180,181,189
     */
    NSString *MOBILE = @"^1(3[0-9]|4[579]|5[0-35-9]|7[0-9]|8[0-9])\\d{8}$";
    /**
     * 中國移動:China Mobile
     * 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188
     */
    NSString *CM = @"^1(3[4-9]|4[7]|5[0-27-9]|7[08]|8[2-478])\\d{8}$";
    /**
     * 中國聯(lián)通:China Unicom
     * 130,131,132,145,155,156,170,171,175,176,185,186
     */
    NSString *CU = @"^1(3[0-2]|4[5]|5[56]|7[0156]|8[56])\\d{8}$";
    /**
     * 中國電信:China Telecom
     * 133,149,153,170,173,177,180,181,189
     */
    NSString *CT = @"^1(3[3]|4[9]|53|7[037]|8[019])\\d{8}$";
    
    
    NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
    NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
    NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
    NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];

    if (([regextestmobile evaluateWithObject:mobileNum] == YES)
        || ([regextestcm evaluateWithObject:mobileNum] == YES)
        || ([regextestct evaluateWithObject:mobileNum] == YES)
        || ([regextestcu evaluateWithObject:mobileNum] == YES))
    {
        return YES;
    }
    else
    {
        return NO;
    }
}
下面我們簡單拆分上面方法劲阎,來應對不同的需求

如果只是簡單匹配是否是 手機號碼绘盟,并不需要上面那么多行代碼,可以簡單寫成這樣:

NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9])\\d{8}$";
NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
return [regextestmobile evaluateWithObject:mobileNum];

如果你需要匹配是否是 移動/聯(lián)通/電信 手機號悯仙。
判斷移動手機號就是這樣:

+ (BOOL)isChinaMobile:(NSString *)phoneNum
{
    NSString *CM = @"^1(3[4-9]|4[7]|5[0-27-9]|7[08]|8[2-478])\\d{8}$";
    NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
    return [regextestcm evaluateWithObject:phoneNum];
}

相信細心的朋友龄毡,應該已經明白了。判斷聯(lián)通手機號锡垄,只要把我們的正則字符串改成上面判斷聯(lián)通手機號的字符串就可以了沦零。判斷哪種就改變正則表達式就可以了

ok,在這個基礎上货岭,我們還可以組合來判斷具體是哪個運營商的手機號路操,代碼如下:

+ (NSString *)getPhoneNumType:(NSString *)phoneNum
{
    return [self isChinaMobile:phoneNum]? @"中國移動": ([self isChinaUnicom:phoneNum]? @"中國聯(lián)通":([self isChinaTelecom:phoneNum]? @"中國電信": @"未知"));
}

主要方法都已公布,至于swift或者其他語言代碼塊就不一一放上來了千贯,真讓我都寫屯仗,我也不一定都會。丈牢。祭钉。哈哈哈,核心正則表達式己沛,都是可以用的慌核,拿著代入進去就ok了。

最后如果發(fā)現(xiàn)問題申尼,請告訴我垮卓,方便我及時進行修改。(感謝 @聯(lián)通企業(yè)平臺-專家客戶 提供的數據)


2016-08-15 修改更新手機匹配字段师幕,包括171粟按,170等虛擬字段

因為虛擬號碼增加太快诬滩,對于170號段我這里已經放開了,并沒有精確到是哪個運營商灭将。只要170號段的號碼都能過疼鸟。

大家如果不是要求那么精準的話,可以使用 流刃若火泣 的正則表達式: ^1(3|4|5|7|8)[0-9]\d{8}$


2017-12-04 修改17x等虛擬號段

對于17x號段徹底放開庙曙,并沒有精確到是哪個運營商空镜。只要17開頭的號段的號碼都能過。
在網上看到個網址捌朴,據說每月都更新吴攒,可以自測一下。如果需要精準號碼是何運營商砂蔽,可以根據此網址來修改對應正則表達式
http://www.xeasy.net/mobile/register.php

感謝每一位評論者的意見與建議洼怔,thanks

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市左驾,隨后出現(xiàn)的幾起案子镣隶,更是在濱河造成了極大的恐慌,老刑警劉巖什荣,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矾缓,死亡現(xiàn)場離奇詭異,居然都是意外死亡稻爬,警方通過查閱死者的電腦和手機嗜闻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桅锄,“玉大人琉雳,你說我怎么就攤上這事∮蚜觯” “怎么了翠肘?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辫秧。 經常有香客問我束倍,道長,這世上最難降的妖魔是什么盟戏? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任绪妹,我火速辦了婚禮,結果婚禮上柿究,老公的妹妹穿的比我還像新娘邮旷。我一直安慰自己,他們只是感情好蝇摸,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布婶肩。 她就那樣靜靜地躺著办陷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪律歼。 梳的紋絲不亂的頭發(fā)上民镜,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音苗膝,去河邊找鬼殃恒。 笑死,一個胖子當著我的面吹牛辱揭,可吹牛的內容都是我干的。 我是一名探鬼主播病附,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼问窃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了完沪?” 一聲冷哼從身側響起域庇,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎覆积,沒想到半個月后听皿,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡宽档,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年尉姨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吗冤。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡又厉,死狀恐怖,靈堂內的尸體忽然破棺而出椎瘟,到底是詐尸還是另有隱情覆致,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布肺蔚,位于F島的核電站煌妈,受9級特大地震影響,放射性物質發(fā)生泄漏宣羊。R本人自食惡果不足惜璧诵,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望段只。 院中可真熱鬧腮猖,春花似錦、人聲如沸赞枕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姐赡,卻和暖如春莱预,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背项滑。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工依沮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枪狂。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓危喉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親州疾。 傳聞我的和親對象是個殘疾皇子辜限,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容

  • 新版正則表達式代碼: + (BOOL)isMobileNumber:(NSString *)mobileNum{i...
    Amok校長閱讀 2,700評論 0 0
  • 初衷:看了很多視頻、文章严蓖,最后卻通通忘記了薄嫡,別人的知識依舊是別人的,自己卻什么都沒獲得颗胡。此系列文章旨在加深自己的印...
    DCbryant閱讀 3,982評論 0 20
  • 正則表達式到底是什么東西毫深?字符是計算機軟件處理文字時最基本的單位,可能是字母毒姨,數字哑蔫,標點符號,空格手素,換行符鸳址,漢字等...
    獅子挽歌閱讀 2,136評論 0 9
  • 陪你走過了一年級上學期,記得暑假的你多么期盼自己快快成為一名小學生泉懦,和眼里的哥哥姐姐們一樣可以驕傲的掛上紅領巾稿黍,現(xiàn)...
    不花妹閱讀 490評論 2 4
  • 網絡是個大漩渦巡球,如今人們只要一打開電腦或者手機的頁面就會被動地被一堆信息覆蓋,真的是讓人有種窒息的感覺邓嘹。...
    俞歡歡閱讀 248評論 2 1