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}
*/