由于目前开发的项目中很多的表单提交并且上一次也介绍了我们项目中的表单组件封装,但是表单中有很多的字段控制,比如只能输入数字,限制长度,过滤字体等等,在我们的表单组件中主要用正则来控制,所以来总结下正则在iOS开发中的应用,如有不足希望一起交流
NSString自带的搜索和替换方法
搜索相关
- (NSRange)rangeOfString:(NSString *)searchString;
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)searchRange;
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)searchRange locale:(nullable NSLocale *)locale;
这些方法非常的好用可以直接用正则匹配,因为是string自带的方法
但是注意一点一般来说返回值是NSRange类型iOS上一般用range.location != NSNotFound来判断是否搜索到查找的字段,但是有一种特殊的情况如果range == nil 因为是nil所以返回值range.location == 0, range.length == 0这个需要注意别掉坑里了
iOS中的正则类NSRegularExpression
与大部分语言中的正则方法基本类似,主要的方法有
返回所有匹配结果的集合(适合,从一段字符串中提取我们想要匹配的所有数据)
- (NSArray *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
返回正确匹配的个数(通过等于0,来验证邮箱,电话什么的,代替NSPredicate) - (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
返回第一个匹配的结果。注意,匹配的结果保存在 NSTextCheckingResult 类型中 - (NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
返回第一个正确匹配结果字符串的NSRange - (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
block方法 - (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block;
比较特殊的就是最后一个block方法,即调用的时候指定一个Block,进而在执行时,会对目标string上找到的每个匹配的子串执行此Block。
iOS特有的谓词NSPredicate
第一次了解NSPredicate是在使用CoreData的时候使用谓词可以不用写sq语句,NSPredicate可以使用正则但是只是它的一个小功能
谓词的用法还是很多的以后有时间可以总结一下,这次仅仅说明正则的应用一般来说如果用来验证string的格式会用谓词配合正则来验证使用方法如下
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
BOOl res = [pred evaluateWithObject:string];
但是谓词使用正则有一个缺点(当然可以设计出来并不是主要来使用正则的)或者说MATCHES运算符的缺点吧就是会对字符串进行完全的匹配相当于正则加上了$所以只有当正则有$的时候才有使用这种方法,但是谓词其实还是有很多的运算符的功能非常的强大,比如like等等
最后介绍下谓词最强大的地方,对集合类型的过滤
NSArray提供了如下方法使用谓词来过滤集合
- (NSArray<ObjectType> *)filteredArrayUsingPredicate:(NSPredicate *)predicate:使用指定的谓词过滤NSArray集合,返回符合条件的元素组成的新集合
NSMutableArray提供了如下方法使用谓词来过滤集合 - (void)filterUsingPredicate:(NSPredicate *)predicate:使用指定的谓词过滤NSMutableArray,剔除集合中不符合条件的元素
NSSet提供了如下方法使用谓词来过滤集合 - (NSSet<ObjectType> *)filteredSetUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0):作用同NSArray中的方法
NSMutableSet提供了如下方法使用谓词来过滤集合 - (void)filterUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0)
这些方法会使对集合类型的过滤非常的方法并且快速,同时NSPredicate还有对字段过滤的功能如果能掌握会全使你的代码非常的优雅精炼
这次的总结就是这样,虽然写的很粗但是只要了解过正则大体的方法都是相似的只是api不同罢了,但是谓词可以好好研究一波确实非常的好用
网友评论