標籤: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