NSRegularExpression iOS內建的Regex

來源:互聯網
上載者:User

標籤:nsregularexpression   Regex   郵箱驗證   

     以前做驗證郵箱,電話號碼的時候通常用第三方的Regex或者NSPredicate(點這裡查看以前的文章),在後期,蘋果推出了自己的Regex來提供給開發人員調用,很方便,功能也強大.

      具體可以查看官方文檔,包括如何書寫進行匹配的Regex例子,這裡我就不多加詳述了,因為本人看那一堆符號好煩.....只好直接求助於Google了,下面只給出幾個常用的.

#define KPhoneRegex  @"\\d{3}-\\d{8}|\\d{3}-\\d{7}|\\d{4}-\\d{8}|\\d{4}-\\d{7}|1+[358]+\\d{9}|\\d{8}|\\d{7}"#define KWebRegex    @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\[email protected]#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\[email protected]#$%^&*+?:_/=<>]*)?)"#define KWebOtherRegex @"http+:[^\\s]*"#define KEmailRegex  @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"

/**     1. 返回所有匹配結果的集合(適合,從一段字串中提取我們想要匹配的所有資料)     *  - (NSArray *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;     2. 返回正確匹配的個數(通過等於0,來驗證郵箱,電話什麼的,代替NSPredicate)     *  - (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;     3. 返回第一個匹配的結果。注意,匹配的結果儲存在  NSTextCheckingResult 類型中     *  - (NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;     4. 返回第一個正確匹配結果字串的NSRange     *  - (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;     5. block方法     *  - (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block;     */        /**     *  enum {     NSRegularExpressionCaseInsensitive             = 1 << 0,   // 不區分大小寫     NSRegularExpressionAllowCommentsAndWhitespace  = 1 << 1,   // 忽略空格和# -     NSRegularExpressionIgnoreMetacharacters        = 1 << 2,   // 整體化     NSRegularExpressionDotMatchesLineSeparators    = 1 << 3,   // 匹配任何字元,包括行分隔字元     NSRegularExpressionAnchorsMatchLines           = 1 << 4,   // 允許^和$在匹配的開始和結束行     NSRegularExpressionUseUnixLineSeparators       = 1 << 5,   // (尋找範圍為整個的話無效)     NSRegularExpressionUseUnicodeWordBoundaries    = 1 << 6    // (尋找範圍為整個的話無效)     };     typedef NSUInteger NSRegularExpressionOptions;     */        // 下面2個枚舉貌似都沒什麼意義,除了在block方法中,一般情況下,直接給0吧    /**     *  enum {     NSMatchingReportProgress         = 1 << 0,     NSMatchingReportCompletion       = 1 << 1,     NSMatchingAnchored               = 1 << 2,     NSMatchingWithTransparentBounds  = 1 << 3,     NSMatchingWithoutAnchoringBounds = 1 << 4     };     typedef NSUInteger NSMatchingOptions;     */        /** 此枚舉值只在5.block方法中用到     *  enum {     NSMatchingProgress               = 1 << 0,     NSMatchingCompleted              = 1 << 1,     NSMatchingHitEnd                 = 1 << 2,     NSMatchingRequiredEnd            = 1 << 3,     NSMatchingInternalError          = 1 << 4     };     typedef NSUInteger NSMatchingFlags;     */        // 測試字串,把裡面的電話號碼解析出來    NSString *urlString = @"哈哈哈哈呵呵呵s15279107723在這裡啊啊啊啊s15279107716";    NSError *error = NULL;    // 根據匹配條件,建立了一個Regex(類方法,執行個體方法類似)    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:KPhoneRegex options:NSRegularExpressionCaseInsensitive error:&error];    if (regex != nil) {        // 3.....        NSTextCheckingResult *firstMatch = [regex firstMatchInString:urlString                                                             options:0                                                            range:NSMakeRange(0, [urlString length])];        if (firstMatch) {            NSRange resultRange = [firstMatch rangeAtIndex:0];            //從urlString中截取資料            NSString *result = [urlString substringWithRange:resultRange];            NSLog(@"result = %@",result);        }        // 2.....        NSUInteger number = [regex numberOfMatchesInString:urlString                                                   options:0                                                   range:NSMakeRange(0, [urlString length])];        NSLog(@"number = %ld",number);        // 5.....(坑爹的返回第一個匹配結果)        [regex enumerateMatchesInString:urlString options:0 range:NSMakeRange(0, [urlString length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {            NSLog(@"---%@",NSStringFromRange([result range]));            if (flags != NSMatchingInternalError) {                NSRange firstHalfRange = [result rangeAtIndex:0];                if (firstHalfRange.length > 0) {                    NSString *resultString1 = [urlString substringWithRange:firstHalfRange];                    NSLog(@"result1 = %@",resultString1);                }            }            *stop = YES;        }];    }        // 替換掉你要匹配的字串    NSString *reString = [regex stringByReplacingMatchesInString:urlString                                                        options:0                                                        range:NSMakeRange(0, [urlString length])                                                        withTemplate:@"(我就是替換的值)"];    NSLog(@"reString = %@",reString);    // 還有2個方法大家可以去嘗試看看            // 1.    NSMutableArray *oneArray = [self _matchLinkWithStr:urlString withMatchStr:KPhoneRegex];    for (NSString *phone in oneArray) {        NSLog(@"phone = %@",phone);    }

// 1.....- (NSMutableArray *)_matchLinkWithStr:(NSString *)str withMatchStr:(NSString *)matchRegex;{    NSError *error = NULL;    NSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:matchRegex                                                                         options:NSRegularExpressionCaseInsensitive                                                                           error:&error];    NSArray *match = [reg matchesInString:str                                  options:NSMatchingReportCompletion                                  range:NSMakeRange(0, [str length])];        NSMutableArray *rangeArr = [NSMutableArray array];    // 取得所有的NSRange對象    if(match.count != 0)    {        for (NSTextCheckingResult *matc in match)        {            NSRange range = [matc range];            NSValue *value = [NSValue valueWithRange:range];            [rangeArr addObject:value];        }    }    // 將要匹配的值取出來,存入數組當中    __block NSMutableArray *mulArr = [NSMutableArray array];    [rangeArr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {        NSValue *value = (NSValue *)obj;        NSRange range = [value rangeValue];        [mulArr addObject:[str substringWithRange:range]];    }];    return mulArr;}

    @結果:


NSRegularExpression 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.