系統自帶的, 如: NSPredicate, rangeOfString:option, NSRegularExpression RegexKitLite RegexKitLite 是一個輕量級的 Objective-C 的正則表達式庫,支持 Mac OS X 和 iOS,使用 ICU 庫開發。正則表達式,又稱正規表示法、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器裡,正則表達式通常被用來檢索、替換那些符合某個模式的文本。
至於RegexKitLite
, 這裡不做介紹。著重介紹系統自帶的那幾個辦法。
PS: 閱讀本文前提是您已經掌握了正則基本語法, 如果對正則還不太了解, 可以參考以下幾個鏈接:
正則表達式學習鏈接:
55分鐘學會正則表達式 揭開正則表達式的神秘面紗 RegExLib.com(正則表達式庫查詢)簡述:Cocoa框架中的NSPredicate用於查詢,原理和用法都類似於SQL中的where,作用相當於數據庫的過濾取。
NSPredicate *predicate = [NSPredicate predicateWithFormat:(NSString *), ...];
其中, 常見的Format
有:
(1) 比較運算符: >, <, ==, >=, <=, !=
例:@"number > 100"
(2) 范圍運算符: IN, BETWEEN
例:@"number BETWEEN {1,5}"
@"address IN {'shanghai','beijing'}"
(3) 字符串本身: SELF
例:@“SELF == ‘APPLE’"
(4) 字符串相關: BEGINSWITH, ENDSWITH, CONTAINS
例:@"name CONTAINS[cd] 'ang'" //包含某個字符串
@"name BEGINSWITH[c] 'sh'" //以某個字符串開頭
@"name ENDSWITH[d] 'ang'" //以某個字符串結束
注:[c]不區分大小寫
[d]不區分發音符號即沒有重音符號
[cd]既不區分大小寫,也不區分發音符號。
(5) 通配符: LIKE
例:@"name LIKE[cd] '*er*'" //*代表通配符,Like也接受[cd].
@"name LIKE[cd] '???er*'"
(6) 正則表達式: MATCHES
例:NSString *regex = @"^A.+e$"; //以A開頭,e結尾
@"name MATCHES %@",regex
至於如何使用呢? 下面舉幾個例子:
(a) 對NSArray進行過濾, 帥選出包含”ang”的項
NSArray *array = [[NSArray alloc]initWithObjects:@"beijing", @"shanghai", @"guangzou", @"wuhan", nil];
NSString *string = @"ang";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@", string];
NSLog(@"%@", [array filteredArrayUsingPredicate:pred]);
// 打印結果:
// (
// shanghai,
// guangzou
// )
(b) 對NSDate進行篩選
//日期在十天之內:
NSDate *endDate = [NSDate date];
NSTimeInterval timeInterval= [endDate timeIntervalSinceReferenceDate];
timeInterval -=3600*24*10;
NSDate *beginDate = [NSDate dateWithTimeIntervalSinceReferenceDate:timeInterval];
//對coredata進行篩選(假設有fetchRequest)
NSPredicate *predicate_date = [NSPredicate predicateWithFormat:@"date >= %@ AND date <= %@", beginDate,endDate];
[fetchRequest setPredicate:predicate_date];
OK, NSPredicate
的功能很多, 也很強大。這裡暫時就點到此, 感興趣的可以自己一一試驗。 下面舉兩個例子說明一下如何使用正則。
// 判斷是否是有效郵箱
- (BOOL)isValidateEmail:(NSString *)email{
NSString *regex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [predicate evaluateWithObject:email];
}
// 判斷字符串首字母是否為字母
- (BOOL)isStartedWithWord:(NSString *)aString{
NSString *regex = @"[A-Za-z]+";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [predicate evaluateWithObject:aString];
}
NSString *searchText = @"// Do any additional setup after loading the view, typically from a nib.";
NSRange range = [searchText rangeOfString:@"(?:[^,])*\\." options:NSRegularExpressionSearch];
if (range.location != NSNotFound) {
NSLog(@"%@", [searchText substringWithRange:range]);
}
// 打印結果:
// typically from a nib.
options中設定NSRegularExpressionSearch就是表示利用正則表達式匹配,會返回第一個匹配結果的位置。
詳細了解: iOS 正則表達式 NSRegularExpression
上面那篇文章總結的很不錯. 這裡簡單再舉個例子:
NSString *searchText = @"// Do any additional setup after loading the view, typically from a nib.";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?:[^,])*\\." options:NSRegularExpressionCaseInsensitive error:&error];
NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
if (result) {
NSLog(@"%@\n", [searchText substringWithRange:result.range]);
}
// 打印結果:
// typically from a nib.
使用系統的正則表達式類(NSRegularExpression)會返回匹配的多個結果。
針對以上3種方式, 做一個小小總結
第一種匹配需要學習NSPredicate的寫法,需要查閱蘋果相關技術文檔;
如果只關心第一個匹配的結果,第二種匹配較為簡潔;
如果需要匹配多個結果,同時匹配多次,第三種方式效率會更高。
參考: IOS常用正則表達式