系统内部的方法和枚举的详细介绍
/**
1. 返回所有匹配结果的集合(适合,从一段字符串中提取我们想要匹配的所有数据)
* - (NSArray *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
2. 返回正确匹配的个数(通过等于0,来验证邮箱,电话什么的,代替NSPredicate)
* - (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
3. 返回第一个匹配的结果。注意,匹配的结果保存在 NSTextCheckingResult 类型中
* - (NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
4. 返回第一个正确匹配结果字符串的NSRange
* - (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
5. block方法
* - (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block;
*/
/**
* enum {
NSRegularExpressionCaseInsensitive = 1 << 0, // 不区分大小写的
NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1, // 忽略空格和# -
NSRegularExpressionIgnoreMetacharacters = 1 << 2, // 整体化
NSRegularExpressionDotMatchesLineSeparators = 1 << 3, // 匹配任何字符,包括行分隔符
NSRegularExpressionAnchorsMatchLines = 1 << 4, // 允许^和$在匹配的开始和结束行
NSRegularExpressionUseUnixLineSeparators = 1 << 5, // (查找范围为整个的话无效)
NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6 // (查找范围为整个的话无效)
};
typedef NSUInteger NSRegularExpressionOptions;
*/
// 下面2个枚举貌似都没什么意义,除了在block方法中,一般情况下,直接给0吧
/**
* enum {
NSMatchingReportProgress = 1 << 0,
NSMatchingReportCompletion = 1 << 1,
NSMatchingAnchored = 1 << 2,
NSMatchingWithTransparentBounds = 1 << 3,
NSMatchingWithoutAnchoringBounds = 1 << 4
};
typedef NSUInteger NSMatchingOptions;
*/
/** 此枚举值只在5.block方法中用到
* enum {
NSMatchingProgress = 1 << 0,
NSMatchingCompleted = 1 << 1,
NSMatchingHitEnd = 1 << 2,
NSMatchingRequiredEnd = 1 << 3,
NSMatchingInternalError = 1 << 4
};
typedef NSUInteger NSMatchingFlags;
*/
// 测试字符串,把里面的电话号码解析出来
NSString *urlString = @"哈哈哈哈呵呵呵s15279107723在这里啊啊啊啊s15279107716";
NSError *error = NULL;
应用例子
// 根据匹配条件,创建了一个正则表达式(类方法,实例方法类似)
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:KPhoneRegex options:NSRegularExpressionCaseInsensitive error:&error];
if (regex != nil) {
// 3.....
NSTextCheckingResult *firstMatch = [regex firstMatchInString:urlString
options:0
range:NSMakeRange(0, [urlString length])];
if (firstMatch) {
NSRange resultRange = [firstMatch rangeAtIndex:0];
//从urlString中截取数据
NSString *result = [urlString substringWithRange:resultRange];
NSLog(@"result = %@",result);
}
// 2.....
NSUInteger number = [regex numberOfMatchesInString:urlString
options:0
range:NSMakeRange(0, [urlString length])];
NSLog(@"number = %ld",number);
// 5.....(坑爹的返回第一个匹配结果)
[regex enumerateMatchesInString:urlString options:0 range:NSMakeRange(0, [urlString length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
NSLog(@"---%@",NSStringFromRange([result range]));
if (flags != NSMatchingInternalError) {
NSRange firstHalfRange = [result rangeAtIndex:0];
if (firstHalfRange.length > 0) {
NSString *resultString1 = [urlString substringWithRange:firstHalfRange];
NSLog(@"result1 = %@",resultString1);
}
}
*stop = YES;
}];
}
// 替换掉你要匹配的字符串
NSString *reString = [regex stringByReplacingMatchesInString:urlString
options:0
range:NSMakeRange(0, [urlString length])
withTemplate:@"(我就是替换的值)"];
NSLog(@"reString = %@",reString);
// 还有2个方法大家可以去尝试看看
// 1.
NSMutableArray *oneArray = [self _matchLinkWithStr:urlString withMatchStr:KPhoneRegex];
for (NSString *phone in oneArray) {
NSLog(@"phone = %@",phone);
}
// 1.....
- (NSMutableArray *)_matchLinkWithStr:(NSString *)str withMatchStr:(NSString *)matchRegex;
{
NSError *error = NULL;
NSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:matchRegex
options:NSRegularExpressionCaseInsensitive
error:&error];
NSArray *match = [reg matchesInString:str
options:NSMatchingReportCompletion
range:NSMakeRange(0, [str length])];
NSMutableArray *rangeArr = [NSMutableArray array];
// 取得所有的NSRange对象
if(match.count != 0)
{
for (NSTextCheckingResult *matc in match)
{
NSRange range = [matc range];
NSValue *value = [NSValue valueWithRange:range];
[rangeArr addObject:value];
}
}
// 将要匹配的值取出来,存入数组当中
__block NSMutableArray *mulArr = [NSMutableArray array];
[rangeArr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSValue *value = (NSValue *)obj;
NSRange range = [value rangeValue];
[mulArr addObject:[str substringWithRange:range]];
}];
return mulArr;
}