正则表达式使用
1、Xcode的类:NSRegularExpression
使用正则表达式的步骤:
step1、定义规则(NSString)
step2、创建正则表达式的对象(NSRegularExpression)
step3、匹配字符串,返回数组(NSArray:存储的对象是NSTextCheckingResult类型的对象)
注意:在Xcode中
如果规则里有引号,就用“\”来表示字符的本身
//----------------------------------------------------------------
NSString *username = @"6gjkhdjkhgkjh7”;//要匹配的字符串
1.定义规则
NSString *pattern = @"^\\d.*\\d$";
2、创建正则表达式对象
NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];
3.匹配字符串
NSArray *results = [regex matchesInString:username options:0 range:NSMakeRange(0, username.length)];
NSLog(@"%zd", results.count);
// 遍历结果
for (NSTextCheckingResult *result in results) {
NSLog(@"%@ %@", NSStringFromRange(result.range), [str substringWithRange:result.range]);
NSLog(@"%@ %@", NSStringFromRange(result.range), [str substringWithRange:result.range]);
}
//——例2-----------------------
NSString *str = @"#呵呵呵#[偷笑] http://foo.com/blah_blah #解放军#//http://foo.com/blah_blah @Ring花椰菜:就#范德萨发生的#舍不得打[test] 就惯#急急急#着他吧[挖鼻屎]//@崔西狮:小拳头举起又放下了 说点啥好呢…… //@toto97:@崔西狮 蹦米咋不揍他#哈哈哈# http://foo.com/blah_blah";
/**
1.判断字符串是否符合某个特定规则
1.判断字符串是否符合某个特定规则
* 判断某个字符串是否为QQ号码\电话号码\邮箱
2.截取字符串中符合某个特定规则的内容
* 截取@"#呵呵呵#[偷笑]5345 http://foo.com/blah_blah #解放军# 58937985"的所有话题\表情\链接
* 截取@"#呵呵呵#[偷笑]5345 http://foo.com/blah_blah #解放军# 58937985"的所有话题\表情\链接
*/
// 表情的规则
NSString *emotionPattern = @"\\[[0-9a-zA-Z\\u4e00-\\u9fa5]+\\]";
// @的规则
NSString *atPattern = @"@[0-9a-zA-Z\\u4e00-\\u9fa5]+";
// #话题#的规则
NSString *topicPattern = @"#[0-9a-zA-Z\\u4e00-\\u9fa5]+#";
// url链接的规则
NSString *urlPattern = @"\\b(([\\w-]+://?|www[.])[^\\s()<>]+(?:\\([\\w\\d]+\\)|([^[:punct:]\\s]|/)))";
// | 匹配多个条件,相当于or\或
NSString *urlPattern = @"\\b(([\\w-]+://?|www[.])[^\\s()<>]+(?:\\([\\w\\d]+\\)|([^[:punct:]\\s]|/)))";
// | 匹配多个条件,相当于or\或
NSString *pattern = [NSString stringWithFormat:@"%@|%@|%@|%@", emotionPattern, atPattern, topicPattern, urlPattern];
NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];
// 2.匹配字符串
NSArray *results = [regex matchesInString:str options:0 range:NSMakeRange(0, str.length)];
// 3.遍历结果
for (NSTextCheckingResult *result in results) {
NSLog(@"%@ %@", NSStringFromRange(result.range), [str substringWithRange:result.range]);
// 3.遍历结果
for (NSTextCheckingResult *result in results) {
NSLog(@"%@ %@", NSStringFromRange(result.range), [str substringWithRange:result.range]);
}
//----------------------------------------------------------------
2、第三方库 RegexKitLite
这个库使用了分类(category)对NSString类进行了扩展
准备工作:
注:加载framework libicucore.dylib ,因为RegexKitLite是调用这个里面的API,苹果规定过不能使用私有的api和没有发布的api。RegexKitLite对NSString做了扩展,因此,我们可以直接对NSString对象进行正则表达式的匹配。
//----------------------------------------------------------------
使用:
//1、用数组返回的结果,是Unicode编码
NSArray *cmps = [str componentsMatchedByRegex:pattern];
//2、遍历所有的匹配结果,一个一个输出
NSArray *cmps = [str componentsMatchedByRegex:pattern];
//2、遍历所有的匹配结果,一个一个输出
[str enumerateStringsMatchedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
//*capturedStrings:用指针获取返回的值
//Range:返回起始位置和匹配到的字符串长度
//*stop =YES;//就会停止遍历
NSLog(@"%@ %@", *capturedStrings, NSStringFromRange(*capturedRanges));
}];
//3、以正则表达式为切割符,返回匹配到的结果之外的字符串
[str enumerateStringsSeparatedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
//*capturedStrings:用指针获取返回的值
//Range:返回起始位置和匹配到的字符串长度
NSLog(@"%@ %@", *capturedStrings, NSStringFromRange(*capturedRanges));
[str enumerateStringsSeparatedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
//*capturedStrings:用指针获取返回的值
//Range:返回起始位置和匹配到的字符串长度
NSLog(@"%@ %@", *capturedStrings, NSStringFromRange(*capturedRanges));
}];