一、了解正则表达式

        正则表达式是一段字符串,它有特殊的含义。我们可以用它来检索特定格式的字符串、替换特定字符串等功能。在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);
    }
}