一、了解正则表达式
正则表达式是一段字符串,它有特殊的含义。我们可以用它来检索特定格式的字符串、替换特定字符串等功能。在ios中有两种方式使用正则表达式,一种是NSPredicate类,谓词,主要用于从集合中挑选出符合条件的对象,和字符串的正则匹配;一种是NSRegularExpression,它是ios中专门用于处理正则表达式的类。
二、NSPredicate谓词
1、NSPredicate配合正则匹配,缺点是会有匹配不准确的情况出现
+ (BOOL)checkTelNumber:(NSString *) telNumber {
//1、准备正则式通配符
NSString *pattern = @"^1+[3578]+\\d{9}";
//2、平接谓词
// SELF MATCHES : SELF表示要验证的字符串,MATCHES表示对字符串的操作
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
//3、正则匹配
BOOL isMatch = [pred evaluateWithObject:telNumber];
return isMatch;
}
2、
三、NSRegularExpression正则表达式
1、初始化方法:
有两个,基本一样
+ (NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
- (instancetype)initWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
参数:
参数一:pattern:正则通配符
参数二:NSRegularExpressionOptions 匹配操作的类型枚举:
NSRegularExpressionCaseInsensitive //不区分字母大小写的模式,aBc 会匹配到abc
NSRegularExpressionAllowCommentsAndWhitespace //忽略掉正则表达式中的空格和#号之后的字符,表达式[a-z],会匹配到[a-z]
NSRegularExpressionIgnoreMetacharacters //将正则表达式整体作为字符串处理。表达式 a b c 会匹配到abc,ab#c会匹配到ab
NSRegularExpressionDotMatchesLineSeparators //允许.匹配任何字符,包括换行符
NSRegularExpressionAnchorsMatchLines //允许^和$符号匹配行的开头和结尾
NSRegularExpressionUseUnixLineSeparators //设置\n为唯一的行分隔符,否则所有的都有效
NSRegularExpressionUseUnicodeWordBoundaries //使用Unicode TR#29标准作为词的边界,否则所有传统正则表达式的词边界都有效
参数三:error:错误信息
2、调用方法
//方法一:带block
- (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (NS_NOESCAPE ^)(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL *stop))block;
//方法二:返回一个结果数组,将所有匹配的结果返回
- (NSArray<NSTextCheckingResult *> *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
//方法三:这个方法会返回第一个查询到得结果,这个NSTextCheckingResult对象中有一个range属性,可以得到匹配到的字符串的范围
- (nullable NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
//方法四:返回匹配到得范围,NSRange。
- (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
//方法五:返回匹配到得字符串的个数
- (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
参数:
参数一:string 匹配的字符串
参数二:options 匹配操作的类型
NSMatchingReportProgress //找到最长的匹配字符串后调用block回调
NSMatchingReportCompletion //找到任何一个匹配串后都回调一次block
NSMatchingAnchored //从匹配范围的开始出进行极限匹配
NSMatchingWithTransparentBounds //允许匹配的范围超出设置的范围
NSMatchingWithoutAnchoringBounds //禁止^和$自动匹配行还是和结束
paramter3: 匹配字符串的范围
typedef NS_OPTIONS(NSUInteger, NSMatchingFlags) {
NSMatchingProgress = 1 << 0, //匹配到最长串是被设置
NSMatchingCompleted = 1 << 1, //全部分配完成后被设置
NSMatchingHitEnd = 1 << 2, //匹配到设置范围的末尾时被设置
NSMatchingRequiredEnd = 1 << 3, //当前匹配到的字符串在匹配范围的末尾时被设置
NSMatchingInternalError = 1 << 4 //由于错误导致的匹配失败时被设置
};
3、应用
+ (void)checkEmail:(NSString *)checkStr {
//1、定义error
NSError *error;
//2、准备正则通配符
NSString *pattern = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,3}";
//3、创建正则表达式
NSRegularExpression *regx = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
//4、如果没有错误,则进行正则匹配
if (!error) {
NSRange range = NSMakeRange(0, checkStr.length);
// 第一个参数是要匹配的字符串,第二个参数是匹配操作的类型,第三个是要匹配字符串的范围
// 建议进入头文件查看其他方法
/* 返回第一个查询到的结果
*/
NSTextCheckingResult *match = [regx firstMatchInString:checkStr options:NSMatchingReportProgress range:range];
if (match) {
//5、range匹配获取字符串
NSString *resultStr = [checkStr substringWithRange:match.range];
NSLog(@"匹配到的字符串%@", resultStr);
} else {
NSLog(@"没有匹配到");
}
} else {
NSLog(@"错误类型:%@",error);
}
}