iOS中正则表达式的用法

1.判断字符串是否符合正则

//------  NSPredicate(谓词)匹配  -----
NSString *email = @"15173265865";
NSString *regex = @"1[358][0-9]{9}" ;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
NSLog(@"%d",[predicate evaluateWithObject:email]);//1,如果正则{9}改成{1},打印结果为0

2.查找满足条件的子字符串

2.1 NSString的API:rangeOfString:option:查找字符串中满足正则的子字符串

NSString *searchText = @"15173265132";
NSString *regex1 = @"1[358][0-9]{1}" ;
NSRange range = [searchText rangeOfString:regex1 options:NSRegularExpressionSearch];
if (range.location != NSNotFound) {
    NSLog(@"%@", [searchText substringWithRange:range]); //151,会返回第一个匹配结果的位置
}

2.2 NSRegularExpressionSearch 替换匹配的子字符串

NSString *replaceString = [searchText stringByReplacingOccurrencesOfString:regex1 withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, searchText.length)];
NSLog(@"--- :%@",replaceString); //73265

2.3 enumerateMatchesInString block的形式,可以得到字符串然后做一些操作

NSString *searchText = @"15173261865/18551510506";
NSString *regexStr = @"1[358][0-9]{1}";
NSError *error;
NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:regexStr options:NSRegularExpressionCaseInsensitive error:&error];
if (error) return;
NSInteger count = [regular numberOfMatchesInString:searchText options:NSMatchingReportCompletion range:NSMakeRange(0, searchText.length)];
NSLog(@"%d",count); //4

//也可以用block
[regular enumerateMatchesInString:searchText options:NSMatchingReportCompletion range:NSMakeRange(0, searchText.length) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
    NSRange matchRange = result.range;
    NSLog(@"range:%@",NSStringFromRange(matchRange));
    NSString *str = [searchText substringWithRange:matchRange];
    NSLog(@"%@",str);
}];
/*上面的打印结果:
2018-06-26 21:19:31.818 DataBaseDemo[18967:563419] range:{0, 3}
2018-06-26 21:19:31.818 DataBaseDemo[18967:563419] 151
2018-06-26 21:19:31.818 DataBaseDemo[18967:563419] range:{7, 3}
2018-06-26 21:19:31.818 DataBaseDemo[18967:563419] 186
2018-06-26 21:19:31.818 DataBaseDemo[18967:563419] range:{12, 3}
2018-06-26 21:19:31.818 DataBaseDemo[18967:563419] 185
2018-06-26 21:19:31.819 DataBaseDemo[18967:563419] range:{16, 3}
2018-06-26 21:19:31.819 DataBaseDemo[18967:563419] 151
2018-06-26 21:19:31.819 DataBaseDemo[18967:563419] range:{0, 0}
*/ 

2.4 matchesInString 直接得到数组

NSTextCheckingResult *match = [regular firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
  NSLog(@"first-result.range = %@",NSStringFromRange(match.range)); //first-result.range = {0, 3}
  NSArray<NSTextCheckingResult *> *resultsSign = [regular matchesInString:string options:0 range:NSMakeRange(0, string.length)];

3. NSDataDetector 这个类是NSRegularExpression的子类,对常用的正则匹配做了封装

 NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeAddress | NSTextCheckingTypePhoneNumber | NSTextCheckingTypeLink
                                                           error:nil];
//需要检测的字符串
NSString *testStr = @"有一个网址:wwww.JohnnyLiu.com有 一个电话:15310547654 还有一个地址:北京市大屯街道 你看看这个www.baidu.com/sabc/bnss怎 么样?";
[detector enumerateMatchesInString:testStr options:NSMatchingReportCompletion range:NSMakeRange(0, testStr.length) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
    NSLog(@"result.range = %@",NSStringFromRange(result.range));
    if (result.URL) {
        NSLog(@"url = %@",result.URL);
    }
    if (result.phoneNumber) {
        NSLog(@"phone = %@",result.phoneNumber);
    }
    if ([result resultType] == NSTextCheckingTypeAddress) {

        NSDictionary<NSString *, NSString *> * addressComponent = [result addressComponents];
        NSLog(@"城市:%@, 街道:%@", addressComponent[NSTextCheckingCityKey], addressComponent[NSTextCheckingStreetKey]);
    }
}];

/*
 打印结果: //不知道为什么,地址没有匹配出来地址
 2018-06-26 21:56:22.297 DataBaseDemo[20712:614322] url = http://wwww.JohnnyLiu.com
 2018-06-26 21:56:26.319 DataBaseDemo[20712:614322] result.range = {28, 14}
 2018-06-26 21:56:26.319 DataBaseDemo[20712:614322] phone = 电话:15310547654
 2018-06-26 21:56:26.323 DataBaseDemo[20712:614322] result.range = {63, 24}
 2018-06-26 21:56:26.323 DataBaseDemo[20712:614322] url = http://www.baidu.com/sabc/bnss%E6%80%8E
 2018-06-26 21:56:26.323 DataBaseDemo[20712:614322] result.range = {0, 0}
 */