IOS中NSPredicate和NSRegularExpression校验正则表达式区别
在代码开发过程中,我们经常需要用来校验邮箱、手机号等等,这个时候就需要用到正则表达式。在iOS开发中,能用来做正则校验的有两个NSPredicate和NSRegularExpression。
NSPredicate
NSPredicate能用来简单做正则校验,但是它的问题是存在校验不出来的情况。
//NSString+RegEx.h #import@interfaceNSString(RegEx) #pragmamark-NSPredicate -(BOOL)mars_matchedByPrdicateToRegEx:(NSString*)regEx; @end //NSString+RegEx.m #import"NSString+RegEx.h" @implementationNSString(RegEx) #pragmamark-NSPredicate -(BOOL)mars_matchedByPrdicateToRegEx:(NSString*)regEx{ NSPredicate*predicate=[NSPredicatepredicateWithFormat:@"SELFMATCHES%@",regEx]; return[predicateevaluateWithObject:self]; } @end
NSRegularExpression(推荐)
NSRegularExpression相对于NSPredicate功能就强大的多了,这也是iOS正则校验的正统路子。
//NSString+RegEx.h #import@interfaceNSString(RegEx) #pragmamark-NSRegularExpression //校验是否匹配 -(BOOL)mars_matchedToRegEx:(NSString*)regEx; //匹配到的第一个字符串 -(NSString*)mars_firstMatchToRegEx:(NSString*)regEx; //所有匹配的字符串 -(NSArray*)mars_matchesToRegEx:(NSString*)regEx; //替换匹配到的字符串 -(NSString*)mars_stringByReplaceMatchesToRegEx:(NSString*)regExreplaceString:(NSString*)replaceString; @end //NSString+RegEx.m #import"NSString+RegEx.h" @implementationNSString(RegEx) #pragmamark-NSRegualrExpression //校验是否匹配 -(BOOL)mars_matchedToRegEx:(NSString*)regEx{ NSError*error; NSRegularExpression*regularExpression=[NSRegularExpressionregularExpressionWithPattern:regExoptions:NSRegularExpressionCaseInsensitiveerror:&error]; NSUIntegernumber=[regularExpressionnumberOfMatchesInString:selfoptions:0range:NSMakeRange(0,self.length)]; returnnumber!=0; } //匹配到的第一个字符串 -(NSString*)mars_firstMatchToRegEx:(NSString*)regEx{ NSError*error; NSRegularExpression*regularExpression=[NSRegularExpressionregularExpressionWithPattern:regExoptions:NSRegularExpressionCaseInsensitiveerror:&error]; NSTextCheckingResult*firstMatch=[regularExpressionfirstMatchInString:selfoptions:0range:NSMakeRange(0,self.length)]; if(firstMatch){ NSString*result=[selfsubstringWithRange:firstMatch.range]; returnresult; } returnnil; } //所有匹配的字符串 -(NSArray*)mars_matchesToRegEx:(NSString*)regEx{ NSError*error; NSRegularExpression*regularExpression=[NSRegularExpressionregularExpressionWithPattern:regExoptions:NSRegularExpressionCaseInsensitiveerror:&error]; NSArray*matchArray=[regularExpressionmatchesInString:selfoptions:0range:NSMakeRange(0,self.length)]; NSMutableArray*array=[NSMutableArrayarray]; if(matchArray.count!=0){ for(NSTextCheckingResult*matchinmatchArray){ NSString*result=[selfsubstringWithRange:match.range]; [arrayaddObject:result]; } } returnarray; } //替换匹配到的字符串 -(NSString*)mars_stringByReplaceMatchesToRegEx:(NSString*)regExreplaceString:(NSString*)replaceString{ NSError*error; NSRegularExpression*regularExpression=[NSRegularExpressionregularExpressionWithPattern:regExoptions:NSRegularExpressionCaseInsensitiveerror:&error]; return[regularExpressionstringByReplacingMatchesInString:selfoptions:0range:NSMakeRange(0,self.length)withTemplate:replaceString]; } @end
最后我们看到,还是推荐大家使用NSRegularExpression来做正则的校验,如果大家在学习中有更好的解决方法或者心得,可以在下方的留言区讨论。