iOS實現簡書的帳號識別方式(Regex)

來源:互聯網
上載者:User

標籤:src   result   格式   技術   調用   方式   reg   uitext   indent   

通過簡書iOS用戶端登入,我們會看到請輸入手機號或者郵箱登入,但是我們隨機輸入1234567的時候,便會彈出手機格式不正確,同樣也會識別我們的郵箱格式,那麼我們在項目中怎麼實現這種判斷呢?


0E471361-060C-4D93-913F-73622F89BC60.png

這就是我們今天要說的Regex。

Regex的介紹

Regex有多種使用方法,根據我們的需要,我們是要判斷輸入是否合法,還是尋找指定的內容,還是捕獲多個輸入的內容,可以選用不同的方法,今天我們主要說一下,判斷輸入是否合法,用謂詞的方式來建立Regex,以後如果有用到的,再寫一篇吧。

謂詞(NSPredicate)

NSPredicate是什麼意思呢。NSPredicate即謂詞邏輯。和資料庫的SQL語句具有相似性,都是從資料堆中根據條件進行篩選。 謂詞,指定過濾器的條件,將合格對象保留下來 ,一般用謂詞過濾數組中指定的元素 ,定義謂詞對象,謂詞對象中包含了過濾元素,使用謂詞條件過濾之後得到我們想要的結果。總得來說呢,Cocoa提供了一個類NSPredicate類,該類主要用於指定過濾器的條件,該對象可以準確的描述所需條件,對每個對象通過謂詞進行篩選,判斷是否與條件相匹配。謂詞表示計算真值或假值的函數。 下面進行代碼舉例,首先我們建立一個名為Student的類,然後給他設定id,name,height。之後我們引入這個類給他賦值,代碼如下:

    NSMutableArray *array=[NSMutableArray arrayWithCapacity: 5];    Student *student1=[[Student alloc] init];    [student1 setPid: 1];    [student1 setName: @"xiaoming"];    [student1 setHeight: 168];    [array addObject: student1];    Student *student2=[[Student alloc] init];    [student2 setPid: 2];    [student2 setName: @"dahuang"];    [student2 setHeight: 178];    [array addObject: student2];    Student *student3=[[Student alloc] init];    [student3 setPid: 3];    [student3 setName: @"erhuang"];    [student3 setHeight: 188];    [array addObject: student3];

在上述的代碼中,我們建立了一個可變數組,和三個小學生(-_-,不要吐槽我給他們的命名,懶得想..). 下面我們就要建立我們的謂詞了,我們想要篩選出一個id 大於1 ,且升高小於180的小學生來,應該怎麼做呢。

 NSPredicate *pre = [NSPredicate predicateWithFormat:                        @" pid>1 and height<188.0"];     int i=0;    for(i=0;i<[array count];i++){        Student *stu=[array objectAtIndex: i];        //遍曆數組,輸出符合謂詞條件的Student 的name。        if ([pre evaluateWithObject: stu]) {            NSLog(@"11--%@",[stu name]);        }    }

謂詞還可以幫我們做出一些列的篩選,如下:

  //快速篩選數組內容   以及預留位置的使用    NSPredicate *pre2 = [NSPredicate predicateWithFormat:@"pid>%d",1];    NSMutableArray *arrayPre2=[array filteredArrayUsingPredicate: pre2];    NSLog(@"%@",[[arrayPre2 objectAtIndex: 0] name]);

字串的處理

 //name以x開頭的    NSPredicate  *predicate3 = [NSPredicate predicateWithFormat:@"name BEGINSWITH ‘x‘"]; //name以g結尾的    NSPredicate  *predicate4 = [NSPredicate predicateWithFormat:@"name ENDSWITH ‘g‘"];  //name中包含字元a的    NSPredicate  *predicate5 = [NSPredicate predicateWithFormat:@"name CONTAINS ‘a‘"];   //like 匹配任意多個字元    //name中只要有r字元就滿足條件    NSPredicate  *predicate6 = www.90168.org[NSPredicate predicateWithFormat:@"name like ‘*r*‘"];  //?代表一個字元,下面的查詢條件是:name中第二個字元是r的    NSPredicate  *predicate7 = [NSPredicate predicateWithFormat:@"name like ‘*?r*‘"];

謂詞的使用就先到這裡,是不是和資料庫使用感覺差不多呢,下面說說正題的時候來了,我們要怎麼進行把謂詞和Regex結合進行相應的判斷呢。

利用Regex實現判斷

首先我們建立一個UI,包含一個UITextField輸入框和一個提交按鈕,當我們點擊按鈕的時候對我們提交的資料進行判斷。 我們建立一個類,寫出對手機號和郵箱進行判斷的方法

+ (BOOL)GS_isMobileNumber:(NSString *)mobileNum;+ (BOOL)GS_isEmailQualified:(NSString *)emailStr;

然後實現檢測的方法

+ (BOOL)GS_isMobileNumber:(NSString *)mobileNum{    /**     * 手機號碼     * 移動:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188     * 聯通:130,131,132,152,155,156,185,186     * 電信:133,1349,153,180,189     */    //    NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";    /**     * 中國移動:China Mobile     * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188     */    //    NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$"; // China Mobile phoneNum    /**     * 中國聯通:China Unicom     * 130,131,132,152,155,156,185,186     */    //    NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$"; // China Unicom phoneNum    /**     * 中國電信:China Telecom     * 133,1349,153,180,189     */    //    NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$"; // China Telecom phoneNum    /**     *  The following 4 www.90168.org predicate can tell which carrier the number is from.     */    //    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];    //Only Check if the string is a valid telephone number, ignoring the carrier info.    NSString *isMobileRegex = @"^(((13[0-9]{1})|(15[0-9]{1})|(17[0-9]{1})|(18[0,5-9]{1}))+\\d{8})$";//    NSString *isMobileRegex = @"^((\\+86)|(\\(\\+86\\)))?(((13[0-9]{1})|(15[0-9]{1})|(17[0-9]{1})|(18[0,5-9]{1}))+\\d{8})$";    NSPredicate *mobileRegex = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", isMobileRegex];    if (([mobileRegex evaluateWithObject: mobileNum] == YES))    {        return YES;    }else{        return NO;    }}
//檢測是否為郵箱+ (BOOL)GS_isEmailQualified:(NSString *)emailStr{    NSString *pattern = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";    NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];    NSArray *results = [regex matchesInString:emailStr options:0 range:NSMakeRange(0, emailStr.length)];    return results.count > 0;}

然後我們調用建立的方法,去檢測是否為手機號

   if ([GSRegularExpression GS_isMobileNumber:_textfiled.text]) {        NSLog(@"輸入的是正常的手機號碼");    }else{        NSLog(@"輸入的不是正常的手機號碼");    }

根據列印結果,顯示我們是正確的這樣,我們就實現了Regex對手機號和郵箱的判定(郵箱的這是這種調用方式)。

後記

Regex去判斷一些結果,是比較常用的,比如,身份證,車牌,機型,IP地址,輸入是否為全數字等。利用他我們可以實現一些看來比較複雜的效果,現在我們已經實現了簡書的登入對手機號和郵箱識別的功能,希望對大家有所協助。文中有不對的地方,歡迎大家積極指出。

補充補充1:

例如我們給定一個用來判斷密碼的正則

+(BOOL)judgePassWordLegal:(NSString *)pass{    BOOL result ;    // 判斷長度大於8位後再接著判斷是否同時包含數字和字元    NSString * regex = @"^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$";    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];    result = [pred evaluateWithObject:pass];    NSLog(@"%hhd",result);    return result;}

對以上正則我們來怎麼理解他呢? 首先開頭標記 "^" 結尾標記 "$" ,[0-9A-Za-z]{6,20}表示內容包含數字和字母並且限制了他的位元,(?![0-9]+$)這個形式 正向否定預查,具體的格式意義,這裡放上一個網上的連結就不一一寫了,Regex的用法 。

補充2:

關於評論裡面的登入的問題這裡做一下補充:基本流程僅作參考,有不當的歡迎指出。

  • 已授權過—— 授權之後,請求介面——>已綁定過——>返回登入資訊

  • 未授權—— 授權之後,請求介面——>沒有綁定過——>(手機號已經註冊)——>(openid和userid或者手機號綁定,然後返回登入資訊)

  • 未授權——> 授權之後,請求介面——>沒有綁定過——>(沒註冊過的)——>建立帳號,綁定id——>返回登入資訊

iOS實現簡書的帳號識別方式(Regex)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.