1. 程式人生 > IOS開發 >正則表示式在iOS開發中的應用

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

在iOS開發過程中,正則的使用還是比較常見,用來判斷使用者名稱、手機號等的輸入。當碰到這種需求的時候,部分開發的第一印象可能是使用 NSPredicate 的 SELF MATCHES %@ 進行判斷,但遺憾的是此方法並非萬能,存在檢查不出來的情況。其實蘋果專門提供了 NSRegularExpression 這個類來做正則校驗。

NSPredicate

NSPredicate 可能是我們一開始接觸iOS正則實現的方法,但現實是它只能簡單的完成正則功能,並沒有 NSRegularExpression 強大,同時還存在校驗不出來的情況。

NSString *regEx = @"<正則表示式>"
; NSString *string = @"<待匹配的字串>"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regEx]; BOOL matched = [predicate evaluateWithObject:string]; NSLog(@"是否匹配 = %d",matched); 複製程式碼

NSRegularExpression,真正的正則實現 初始化NSRegularExpression**

/// 初始化NSRegularExpression,如果出錯則會返回nil,並帶有error
/// @param pattern 正則表示式
/// @param options 模式選項,一般設成 kNilOptions
/// @parma error 錯誤
+ (nullable NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
複製程式碼

關於NSRegularExpressionOptions

typedef NS_OPTIONS(NSUInteger,NSRegularExpressionOptions) {
   NSRegularExpressionCaseInsensitive             = 1 << 0,//不區分字母大小寫的模式
   NSRegularExpressionAllowCommentsAndWhitespace  = 1 << 1,//忽略掉正則表示式中的空格和#號之後的字元
   NSRegularExpressionIgnoreMetacharacters        = 1 << 2,//將正則表示式整體作為字串處理
   NSRegularExpressionDotMatchesLineSeparators    = 1 << 3,//允許.匹配任何字元,包括換行符  
   NSRegularExpressionAnchorsMatchLines           = 1 << 4,//允許^和$符號匹配行的開頭和結尾
   NSRegularExpressionUseUnixLineSeparators       = 1 << 5,//設定\n為唯一的行分隔符,否則所有的都有效。
   NSRegularExpressionUseUnicodeWordBoundaries    = 1 << 6 //使用Unicode TR#29標準作為詞的邊界,否則所有傳統正則表示式的詞邊界都有效
}; 複製程式碼

前面提到 options 一般設成 kNilOptions ,它的效果就是區分大小寫,嚴格校驗。

匹配 獲取匹配的個數

NSString *regEx = @"<正則表示式>";
NSString *string = @"<待匹配的字串>";
NSError *error;
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regEx options:kNilOptions error:&error];
if (error) {
    NSLog(@"error = %@",error);
}

NSUInteger number = [regularExpression numberOfMatchesInString:string options:kNilOptions range:NSMakeRange(0,string.length)];
NSLog(@"匹配的個數 = %lu",(unsigned long)number);

BOOL matched = (number != 0);
NSLog(@"是否匹配 = %d",matched);
複製程式碼

獲取第一個匹配的結果

NSString *regEx = @"<正則表示式>";
NSString *string = @"<待匹配的字串>";
NSError *error;
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regEx options:kNilOptions error:&error];
if (error) {
    NSLog(@"error = %@",error);
}

NSTextCheckingResult *firstMatch = [regularExpression firstMatchInString:string options:0 range:NSMakeRange(0,string.length)];
if (firstMatch) {
    // NSTextCheckingResult 的 range 屬性即匹配的字串的位置
    NSString *matchedString = [string substringWithRange:firstMatch.range];
    NSLog(@"匹配的字串 = %@",matchedString);       
}
複製程式碼

獲取所有匹配的結果

NSString *regEx = @"<正則表示式>";
NSString *string = @"<待匹配的字串>";
NSError *error;
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regEx options:kNilOptions error:&error];
if (error) {
    NSLog(@"error = %@",error);
}

NSArray *matchArray = [regularExpression matchesInString:string options:0 range:NSMakeRange(0,string.length)];
for (NSTextCheckingResult *match in matchArray) {
    NSString *matchedString = [string substringWithRange:match.range];
    NSLog(@"匹配的字串 = %@",matchedString); 
}
複製程式碼

替換匹配的字串

NSString *regEx = @"<正則表示式>";
NSString *string = @"<待匹配的字串>";
NSString *replacingString = @"<替換的字串>";
NSError *error;
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regEx options:kNilOptions error:&error];
if (error) {
    NSLog(@"error = %@",error);
}

NSString *newString = [regularExpression stringByReplacingMatchesInString:string options:kNilOptions range:NSMakeRange(0,string.length) withTemplate:replacingString];
NSLog(@"替換後的字串 = %@",newString); 
複製程式碼