1、构建自己的正则表达式
某些标准组织发布了对一些事物的精确描述,有些好心的开发者便把他们转化成了便于移植的正则表达式。比方说,下面这个正则表达式可以用来定义浮点数:
^[+-]?[0-9]+[\.]?[0-9]*$
这个定义并不是十分完美,但在很多场合下还是相当好用的,而且用起来也很灵活。它能够接受一大批浮点数,而且它规定开头的正负号是可选择的。尽管这个表达式不能接受-.75这样的数,但是它也有一个好处,就是能把-.这样的输入拦住,这样的权衡方案是合理的,因为用户在输入了-.75并遭到拒绝之后,很容易就能想到自己应该输入的是-0.75.也就可以用另一个正则表达式把上述表达式无法接受的那些合法浮点数检查出来。比方说,我们想接受那种没有整数部分但是有小数点,而且小数点后面必须跟着一个或者多个位的浮点数:
^[+-]?\.[0-9]+$
NSPredicate实例可以把NSString文本与正则表达式相比较,并判断用户是不是输入了有效的浮点数。
NSPredicate *fpPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES'^[+-]?[0-9]+[\\.]?[0-9]*$'"];
BOOL match = [fpPredicate evaluateWithObject:string];
2、枚举正则表达式
NSRegularExpression类提供了一种基于块的枚举方式,可以用来寻找字符串中与正则表达式中相匹配的各个部分。我们可以用这种方式对待特定范围内的文本做出修改。如果发现某段文本与正则表达式相匹配,那么可以通过带属性的文本来设置其颜色或者字体,以便向用户凸显这些内容。这种做法与文本视图的拼写检查器相似,后者会给拼错的单词添加下划线。
如果想自己来实现这个效果,那么就请创建一条正则表达式,然后将它与字符串相匹配,并在每一个能够匹配的范围内,为文本施加某种视觉效果。通过带属性的字符串,我们可以用一种比早前iOS系统更为简单的方式来修改文本视图的内容,从而向用户提供视觉反馈效果:
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"REGEXHERE" options:NSRegularExpressionCaseInsensitive error:nil];
[regex enumerateMatchesInString:text options:0 range:fullRange usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
NSRange range = match.range;
}];
3、数据探测器
NSDataDetector类是NSRegularExpression的子类。数据探测器可用来判断那些定义明确的数据类型,苹果公司已经彻底测试了相关算法,所以不用开发者自己再创建正则表达式了。而且还有好处,就是这些检查都已经本地化了。
NSError *error = NULL;
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink | NSTextCheckingTypePhoneNumber error:&error];
[detector enumerateMatchesInString:text options:0 range:fullRange usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
NSRange range = match.range;
}];
其中支持的数据为:
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
};
4、使用内置类型的探测器
UITextView及UIWebView提供了内置的数据类型探测器,能够识别电话号码、http链接等内容。开发者设置了dataDetectorTypes属性后,视图就会自动把与文本模式相匹配的内容转换成可以点击的URL,并将其嵌入到视图的文本里。可以设置的数据类型包括地址、日历事件、链接以及电话号码。如果将属性设为UIDataDetetorTypeAll,那么就可以匹配所有支持的数据类型,若设为UIDataDetectorTypeNone,则会禁用模式匹配功能。