正則表達式在iOS開發中的應用

在代碼開發過程當中,咱們常常須要用來校驗郵箱、手機號等等,這個時候就須要用到正則表達式。在iOS開發中,能用來作正則校驗的有兩個 NSPredicateNSRegularExpression正則表達式

NSPredicate

NSPredicate 能用來簡單作正則校驗,可是它的問題是存在校驗不出來的狀況。express

//NSString+RegEx.h
#import <Foundation/Foundation.h>

@interface NSString (RegEx)

#pragma mark - NSPredicate

- (BOOL)vl_matchedByPrdicateToRegEx:(NSString *)regEx;

@end

//NSString+RegEx.m
#import "NSString+RegEx.h"

@implementation NSString (RegEx)

#pragma mark - NSPredicate

- (BOOL)vl_matchedByPrdicateToRegEx:(NSString *)regEx{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regEx];
    return [predicate evaluateWithObject:self];
}

@end

NSRegularExpression (推薦)

NSRegularExpression 相對於 NSPredicate 功能就強大的多了,這也是iOS正則校驗的正統路子。lua

//NSString+RegEx.h
#import <Foundation/Foundation.h>

@interface NSString (RegEx)

#pragma mark - NSRegularExpression

//校驗是否匹配
- (BOOL)vl_matchedToRegEx:(NSString *)regEx;

//匹配到的第一個字符串
- (NSString *)vl_firstMatchToRegEx:(NSString *)regEx;

//全部匹配的字符串
- (NSArray *)vl_matchesToRegEx:(NSString *)regEx;

//替換匹配到的字符串
- (NSString *)vl_stringByReplaceMatchesToRegEx:(NSString *)regEx replaceString:(NSString *)replaceString;

@end

//NSString+RegEx.m
#import "NSString+RegEx.h"

@implementation NSString (RegEx)

#pragma mark - NSRegualrExpression

//校驗是否匹配
- (BOOL)vl_matchedToRegEx:(NSString *)regEx{
    
    NSError *error;
    NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regEx options:NSRegularExpressionCaseInsensitive error:&error];
    
    NSUInteger number = [regularExpression numberOfMatchesInString:self options:0 range:NSMakeRange(0, self.length)];
    return number != 0;
}

//匹配到的第一個字符串
- (NSString *)vl_firstMatchToRegEx:(NSString *)regEx{
    NSError *error;
    NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regEx options:NSRegularExpressionCaseInsensitive error:&error];
    NSTextCheckingResult *firstMatch = [regularExpression firstMatchInString:self options:0 range:NSMakeRange(0, self.length)];
    if (firstMatch) {
        NSString *result = [self substringWithRange:firstMatch.range];
        return result;
    }
    return nil;
}

//全部匹配的字符串
- (NSArray *)vl_matchesToRegEx:(NSString *)regEx{
    NSError *error;
    NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regEx options:NSRegularExpressionCaseInsensitive error:&error];
    
    NSArray *matchArray = [regularExpression matchesInString:self options:0 range:NSMakeRange(0, self.length)];
    
    NSMutableArray *array = [NSMutableArray array];
    if (matchArray.count != 0) {
        for (NSTextCheckingResult *match in matchArray) {
            NSString *result = [self substringWithRange:match.range];
            [array addObject:result];
        }
    }
    
    return array;
}

//替換匹配到的字符串
- (NSString *)vl_stringByReplaceMatchesToRegEx:(NSString *)regEx replaceString:(NSString *)replaceString{
    NSError *error;
    NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regEx options:NSRegularExpressionCaseInsensitive error:&error];

    return [regularExpression stringByReplacingMatchesInString:self options:0 range:NSMakeRange(0, self.length) withTemplate:replaceString];
}

@end
相關文章
相關標籤/搜索