NSDataDetector

在Cocoa开发中,有一个简单的对于寻找数据的解决方案:NSDataDetector。NSDataDetector是继承于NSRegularExpression(Cocoa中的正则表达式)的一个子类,你可以把它看作一个正则表达式匹配器和令人难以置信的复杂的表达式,可以从自然语言(虽然可能更复杂)中提取你想要的信息。看看下面一段例子:

NSError *error = nil;

NSDataDetector  *detector = [NSDataDetector  dataDetectorWithTypes:NSTextCheckingTypeLink|NSTextCheckingTypePhoneNumber error:&error];

NSString *string = @"123 Main www.baidu.com St. / (023) 52261439 测试15102814633";

[detector enumerateMatchesInString:string

options:kNilOptions

range:NSMakeRange(0, [string length])

usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {

NSLog(@"Match: %@", result);

}];

输出结果为:NSDataDetectorStudy[17819:208191] Match:{9, 13}{http://www.baidu.com}2016-12-06 14:00:23.780 NSDataDetectorStudy[17819:208191] Match:{29, 14}{(023) 52261439}2016-12-06 14:00:23.780 NSDataDetectorStudy[17819:208191] Match:{46, 11}{15102814633}

可以看到在Block中的NSTextCheckingResult作为结果输出,

注意:当初始化NSDataDetector的时候,只指定自己需要的类型(Type)就可以了,因为多增加一项就会多一些内存的开销。

看了下 NSTextCheckingResult.h 文件,里面可以找到一些系统为你设定好的匹配类型:

typedef NS_OPTIONS(uint64_t, NSTextCheckingType) {    // a single type

NSTextCheckingTypeOrthography          = 1ULL << 0,            // language identification

NSTextCheckingTypeSpelling              = 1ULL << 1,            // spell checking

NSTextCheckingTypeGrammar              = 1ULL << 2,            // grammar checking

NSTextCheckingTypeDate                  = 1ULL << 3,            // date/time detection

NSTextCheckingTypeAddress              = 1ULL << 4,            // address detection

NSTextCheckingTypeLink                  = 1ULL << 5,            // link detection

NSTextCheckingTypeQuote                = 1ULL << 6,            // smart quotes

NSTextCheckingTypeDash                  = 1ULL << 7,            // smart dashes

NSTextCheckingTypeReplacement          = 1ULL << 8,            // fixed replacements, such as copyright symbol for (c)

NSTextCheckingTypeCorrection            = 1ULL << 9,            // autocorrection

NSTextCheckingTypeRegularExpression NS_ENUM_AVAILABLE(10_7, 4_0)  = 1ULL << 10,          // regular expression matches

NSTextCheckingTypePhoneNumber NS_ENUM_AVAILABLE(10_7, 4_0)        = 1ULL << 11,          // phone number detection

NSTextCheckingTypeTransitInformation NS_ENUM_AVAILABLE(10_7, 4_0) = 1ULL << 12            // transit (e.g. flight) info detection

};

如果你想在UILabel中简单地使用NSDataDetector,可以看看这个:TTTAttributedLabel 。

原文 :http://nshipster.com/nsdatadetector/

你可能感兴趣的:(NSDataDetector)