正則表達式 使用代碼


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

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

 

[objc]  view plain  copy
  1. #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}"  
  2. #define KWebRegex    @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)"  
  3. #define KWebOtherRegex @"http+:[^\\s]*"  
  4. #define KEmailRegex  @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"  

 

[objc]  view plain  copy
  1. /** 
  2.      1. 返回所有匹配結果的集合(適合,從一段字符串中提取我們想要匹配的所有數據) 
  3.      *  - (NSArray *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range; 
  4.      2. 返回正確匹配的個數(通過等於0,來驗證郵箱,電話什么的,代替NSPredicate) 
  5.      *  - (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range; 
  6.      3. 返回第一個匹配的結果。注意,匹配的結果保存在  NSTextCheckingResult 類型中 
  7.      *  - (NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range; 
  8.      4. 返回第一個正確匹配結果字符串的NSRange 
  9.      *  - (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range; 
  10.      5. block方法 
  11.      *  - (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block; 
  12.      */  
  13.       
  14.     /** 
  15.      *  enum { 
  16.      NSRegularExpressionCaseInsensitive             = 1 << 0,   // 不區分大小寫的 
  17.      NSRegularExpressionAllowCommentsAndWhitespace  = 1 << 1,   // 忽略空格和# - 
  18.      NSRegularExpressionIgnoreMetacharacters        = 1 << 2,   // 整體化 
  19.      NSRegularExpressionDotMatchesLineSeparators    = 1 << 3,   // 匹配任何字符,包括行分隔符 
  20.      NSRegularExpressionAnchorsMatchLines           = 1 << 4,   // 允許^和$在匹配的開始和結束行 
  21.      NSRegularExpressionUseUnixLineSeparators       = 1 << 5,   // (查找范圍為整個的話無效) 
  22.      NSRegularExpressionUseUnicodeWordBoundaries    = 1 << 6    // (查找范圍為整個的話無效) 
  23.      }; 
  24.      typedef NSUInteger NSRegularExpressionOptions; 
  25.      */  
  26.       
  27.     // 下面2個枚舉貌似都沒什么意義,除了在block方法中,一般情況下,直接給0吧  
  28.     /** 
  29.      *  enum { 
  30.      NSMatchingReportProgress         = 1 << 0, 
  31.      NSMatchingReportCompletion       = 1 << 1, 
  32.      NSMatchingAnchored               = 1 << 2, 
  33.      NSMatchingWithTransparentBounds  = 1 << 3, 
  34.      NSMatchingWithoutAnchoringBounds = 1 << 4 
  35.      }; 
  36.      typedef NSUInteger NSMatchingOptions; 
  37.      */  
  38.       
  39.     /** 此枚舉值只在5.block方法中用到 
  40.      *  enum { 
  41.      NSMatchingProgress               = 1 << 0, 
  42.      NSMatchingCompleted              = 1 << 1, 
  43.      NSMatchingHitEnd                 = 1 << 2, 
  44.      NSMatchingRequiredEnd            = 1 << 3, 
  45.      NSMatchingInternalError          = 1 << 4 
  46.      }; 
  47.      typedef NSUInteger NSMatchingFlags; 
  48.      */  
  49.       
  50.   
  51.     // 測試字符串,把里面的電話號碼解析出來  
  52.     NSString *urlString = @"哈哈哈哈呵呵呵s15279107723在這里啊啊啊啊s15279107716";  
  53.     NSError *error = NULL;  
  54.     // 根據匹配條件,創建了一個正則表達式(類方法,實例方法類似)  
  55.     NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:KPhoneRegex options:NSRegularExpressionCaseInsensitive error:&error];  
  56.     if (regex != nil) {  
  57.         // 3.....  
  58.         NSTextCheckingResult *firstMatch = [regex firstMatchInString:urlString  
  59.                                                              options:0  
  60.                                                             range:NSMakeRange(0, [urlString length])];  
  61.         if (firstMatch) {  
  62.             NSRange resultRange = [firstMatch rangeAtIndex:0];  
  63.             //從urlString中截取數據  
  64.             NSString *result = [urlString substringWithRange:resultRange];  
  65.             NSLog(@"result = %@",result);  
  66.         }  
  67.         // 2.....  
  68.         NSUInteger number = [regex numberOfMatchesInString:urlString  
  69.                                                    options:0  
  70.                                                    range:NSMakeRange(0, [urlString length])];  
  71.         NSLog(@"number = %ld",number);  
  72.         // 5.....(坑爹的返回第一個匹配結果)  
  73.         [regex enumerateMatchesInString:urlString options:0 range:NSMakeRange(0, [urlString length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOLBOOL *stop) {  
  74.             NSLog(@"---%@",NSStringFromRange([result range]));  
  75.             if (flags != NSMatchingInternalError) {  
  76.                 NSRange firstHalfRange = [result rangeAtIndex:0];  
  77.                 if (firstHalfRange.length > 0) {  
  78.                     NSString *resultString1 = [urlString substringWithRange:firstHalfRange];  
  79.                     NSLog(@"result1 = %@",resultString1);  
  80.                 }  
  81.             }  
  82.             *stop = YES;  
  83.         }];  
  84.     }  
  85.       
  86.     // 替換掉你要匹配的字符串  
  87.     NSString *reString = [regex stringByReplacingMatchesInString:urlString  
  88.                                                         options:0  
  89.                                                         range:NSMakeRange(0, [urlString length])  
  90.                                                         withTemplate:@"(我就是替換的值)"];  
  91.     NSLog(@"reString = %@",reString);  
  92.     // 還有2個方法大家可以去嘗試看看  
  93.       
  94.       
  95.     // 1.  
  96.     NSMutableArray *oneArray = [self _matchLinkWithStr:urlString withMatchStr:KPhoneRegex];  
  97.     for (NSString *phone in oneArray) {  
  98.         NSLog(@"phone = %@",phone);  
  99.     }  

 

[objc]  view plain  copy
 在CODE上查看代碼片派生到我的代碼片
  1. // 1.....  
  2. - (NSMutableArray *)_matchLinkWithStr:(NSString *)str withMatchStr:(NSString *)matchRegex;  
  3. {  
  4.     NSError *error = NULL;  
  5.     NSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:matchRegex  
  6.                                                                          options:NSRegularExpressionCaseInsensitive  
  7.                                                                            error:&error];  
  8.     NSArray *match = [reg matchesInString:str  
  9.                                   options:NSMatchingReportCompletion  
  10.                                   range:NSMakeRange(0, [str length])];  
  11.       
  12.     NSMutableArray *rangeArr = [NSMutableArray array];  
  13.     // 取得所有的NSRange對象  
  14.     if(match.count != 0)  
  15.     {  
  16.         for (NSTextCheckingResult *matc in match)  
  17.         {  
  18.             NSRange range = [matc range];  
  19.             NSValue *value = [NSValue valueWithRange:range];  
  20.             [rangeArr addObject:value];  
  21.         }  
  22.     }  
  23.     // 將要匹配的值取出來,存入數組當中  
  24.     __block NSMutableArray *mulArr = [NSMutableArray array];  
  25.     [rangeArr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOLBOOL *stop) {  
  26.         NSValue *value = (NSValue *)obj;  
  27.         NSRange range = [value rangeValue];  
  28.         [mulArr addObject:[str substringWithRange:range]];  
  29.     }];  
  30.     return mulArr;  
  31. }  


    @結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM