IOS中NSPredicate和NSRegularExpression校驗(yàn)正則表達(dá)式區(qū)別
在代碼開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要用來(lái)校驗(yàn)郵箱、手機(jī)號(hào)等等,這個(gè)時(shí)候就需要用到正則表達(dá)式。在iOS開(kāi)發(fā)中,能用來(lái)做正則校驗(yàn)的有兩個(gè) NSPredicate 和 NSRegularExpression 。
NSPredicate
NSPredicate 能用來(lái)簡(jiǎn)單做正則校驗(yàn),但是它的問(wèn)題是存在校驗(yàn)不出來(lái)的情況。
//NSString+RegEx.h
#import <Foundation/Foundation.h>
@interface NSString (RegEx)
#pragma mark - NSPredicate
- (BOOL)mars_matchedByPrdicateToRegEx:(NSString *)regEx;
@end
//NSString+RegEx.m
#import "NSString+RegEx.h"
@implementation NSString (RegEx)
#pragma mark - NSPredicate
- (BOOL)mars_matchedByPrdicateToRegEx:(NSString *)regEx{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regEx];
return [predicate evaluateWithObject:self];
}
@end
NSRegularExpression (推薦)
NSRegularExpression 相對(duì)于 NSPredicate 功能就強(qiáng)大的多了,這也是iOS正則校驗(yàn)的正統(tǒng)路子。
//NSString+RegEx.h
#import <Foundation/Foundation.h>
@interface NSString (RegEx)
#pragma mark - NSRegularExpression
//校驗(yàn)是否匹配
- (BOOL)mars_matchedToRegEx:(NSString *)regEx;
//匹配到的第一個(gè)字符串
- (NSString *)mars_firstMatchToRegEx:(NSString *)regEx;
//所有匹配的字符串
- (NSArray *)mars_matchesToRegEx:(NSString *)regEx;
//替換匹配到的字符串
- (NSString *)mars_stringByReplaceMatchesToRegEx:(NSString *)regEx replaceString:(NSString *)replaceString;
@end
//NSString+RegEx.m
#import "NSString+RegEx.h"
@implementation NSString (RegEx)
#pragma mark - NSRegualrExpression
//校驗(yàn)是否匹配
- (BOOL)mars_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;
}
//匹配到的第一個(gè)字符串
- (NSString *)mars_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 *)mars_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 *)mars_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
最后我們看到,還是推薦大家使用NSRegularExpression來(lái)做正則的校驗(yàn),如果大家在學(xué)習(xí)中有更好的解決方法或者心得,可以在下方的留言區(qū)討論。
相關(guān)文章
iOS使用UIScrollView實(shí)現(xiàn)無(wú)限循環(huán)輪播圖效果
這篇文章主要介紹了iOS使用UIScrollView實(shí)現(xiàn)無(wú)限循環(huán)輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
簡(jiǎn)單講解iOS應(yīng)用開(kāi)發(fā)中的MD5加密的相關(guān)使用
這篇文章主要介紹了iOS應(yīng)用開(kāi)發(fā)中的MD5加密的相關(guān)使用,示例代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-12-12
詳解iOS的UI開(kāi)發(fā)中控制器的創(chuàng)建方法
這篇文章主要介紹了iOS的UI開(kāi)發(fā)中控制器的創(chuàng)建方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-11-11
iOS9中的WebKit 與 Safari帶來(lái)的驚喜
這篇文章主要介紹了iOS9中的WebKit 與 Safari帶來(lái)的驚喜的相關(guān)資料,需要的朋友可以參考下2015-11-11
iOS將時(shí)間NSDate轉(zhuǎn)化為毫秒時(shí)間戳的方法示例
這篇文章主要給大家介紹了關(guān)于iOS將時(shí)間NSDate轉(zhuǎn)化為毫秒時(shí)間戳的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
iOS開(kāi)發(fā)之?dāng)r截URL轉(zhuǎn)換成本地路由模塊URLRewrite詳解
這篇文章主要給大家介紹了關(guān)于iOS開(kāi)發(fā)之?dāng)r截URL轉(zhuǎn)換成本地路由模塊URLRewrite的相關(guān)資料,這是最近在工作中遇到的一個(gè)需求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起看看吧。2017-08-08
iOS11 WKWebView 無(wú)法加載內(nèi)容的解決方法
這篇文章主要介紹了iOS11 WKWebView 無(wú)法加載內(nèi)容,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
ios開(kāi)發(fā)Flutter構(gòu)建todo?list應(yīng)用
這篇文章主要為大家介紹了ios開(kāi)發(fā)Flutter構(gòu)建todo?list應(yīng)用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
iOS開(kāi)發(fā)WebViewJavascriptBridge通訊原理解析
這篇文章主要為大家介紹了iOS開(kāi)發(fā)WebViewJavascriptBridge通訊原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
IOS開(kāi)發(fā)實(shí)現(xiàn)手機(jī)震動(dòng)的提示實(shí)例代碼
這篇文章主要介紹了IOS開(kāi)發(fā)實(shí)現(xiàn)手機(jī)震動(dòng)的提示實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04

