最近在做一个小东西的时候,遇到了一个问题。我有一个字符串,我想要提取其中的一些关机键的信息并用富文本变红标记出来,更醒目写。
由于我是ios小白么,没有任何的想法和思路问了一下同学,他提供给我一会大胆的想法。。。让我去变量字符串,然后判读字符串的下一个是不是我要的信息,然后变量判断我想要的结尾在哪。。说白一点就是掐头去尾要中间。。。然后根据这个range去创建我的富文本。我这一个不愿意啊。。。太麻烦了 拒绝。想来ios应该是有这个东西的吧。 然后我就发现了她----NSRegularExpression 正则表达式这个类可以帮助我解决下。
记录下这个写这个拓展的过程吧。方便以后查阅。传送门.
/** 筛选字符串中的邮箱
@param string 传入字符串
@return 返回邮箱数组 */
+(NSArray *)selectTheEmailOfString : (NSString *)string;
/** 根据传入的规则筛选字符串
@param string 传入的字符串
@param rule 规则
@return 返回符合规则的字符串 */
+(NSString *)selseTheStringFromString : (NSString *)string inRule: (NSString *)rule;
/** 根据传入的规则筛选字符串 返回数组(包含符合的字符串)
@param string 传入的string
@param rule 规则
@return 返回数组 */
+(NSArray *)selseTheStringFromStringAndReturnString : (NSString *)string andRule : (NSString *)rule;
/** 根据传入的正则表达式和字符串 提取符合正则的字符变成红色的富文本返回的对应的富文本
@param string 出入的字符串
@param rule 规则
@return 返回的富文本 */
+(NSMutableAttributedString *)changeTheString : (NSString *)string ByRuchStringInRule : (NSString *)rule;
/** 根据传入的正则字符串生成对应的法则
@param string 传入的正则字符串
@return 返回正则对象 */
+(NSRegularExpression *)ruleOfString : (NSString *)string;
/** 私有的方法 根据传入的颜色和总共的字 和要改变的字的数组改变总共的文字并返回相应的富文本
@param color 传入的颜色(默认颜色为红色)
@param string 传入整体的文字
@param subArray 传入要更改的文字的数组
@return 返回整体带有富文本的文字 */
+(NSMutableAttributedString *)lsh_changeColorWithColor : (UIColor *)color AllString : (NSString *)string SubStringArray : (NSArray *)subArray;
以上是一些在.h封装好的方法可以直接使用 主要说下
+ (NSMutableAttributedString *)changeTheString:(NSString *)string ByRuchStringInRule:(NSString *)rule //这个方法就是最终提取文字富文本显示的方法
//方法的实现
//传入要处理的文本和需要的提取文字的正则表达式
//返回所需文字拼接后的数组
NSArray *tempArray = [self selseTheStringFromStringAndReturnString:string andRule:rule];
//根据这个数组改变提取文字的颜色并返回富文本
return [self lsh_changeColorWithColor:[UIColor redColor] AllString:string SubStringArray:tempArray];
其中传入要处理的文本和需要的提取文字的正则表达式这个方法的实现
//返回符合规则的字符串的数组
+(NSArray *)selseTheStringFromStringAndReturnString : (NSString *)string andRule : (NSString *)rule {
NSMutableArray *resultArray = [[NSMutableArray alloc] init];
NSRegularExpression *regex = [self ruleOfString:rule];
if (regex != nil)
{
//用该方法解析出所有
NSArray* array = [regex matchesInString:string options:NSMatchingReportProgress range:NSMakeRange(0, [string length])]; //当解析出的数组至少有一个对象时,即原文本中存在至少一个符合规则的字段
if (array.count != 0) {
for (NSTextCheckingResult* result in array)
{ NSRange range = result.range;
[resultArray addObject:[string substringWithRange:range]];
} } }
return (NSArray *)resultArray;
}
NSRegularExpression *regex = [self ruleOfString:rule];
NSError *error;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:string options:0 error:&error];
return regex;
传入字符串生成一个正则对象,根据正则取出所有符合正则的数组,
循环遍历出所有结果取出符合字符串并添加到数组中。
最后生成富文本的方法:
+(NSMutableAttributedString *)lsh_changeColorWithColor : (UIColor *)color AllString : (NSString *)string SubStringArray : (NSArray *)subArray {
NSMutableAttributedString *resultString =[[NSMutableAttributedString alloc] initWithString:string];
for (NSString *rangeString in subArray) {
//找出符合条件的字符串在原数组的range
NSRange range = [string rangeOfString:rangeString options:NSBackwardsSearch];
//根据range生成对应的富文本返回
[resultString addAttribute:NSForegroundColorAttributeName value:color range:range]
; }
return resultString;
}
调用://将字符串中邮箱变成红色提示
NSMutableAttributedString *resultString = [NSString changeTheString:@"12321@qq.com 德萨卡 clc_cfzxyq@163.com98349845fwe ctftf:iLoveiOS@qq.com" ByRuchStringInRule:@"\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"];
感觉写着写着就有些乱了。。。很难受 继续去加油努力坚持写
在这里记录下我的收集的几篇关于这个的文章感觉从中收益匪浅也感谢文章的作者~~
一个简书的哥写的介绍:www.jianshu.com/p/09f66e89f071
正则表达式的教程:deerchao.net/tutorials/regex/regex.htm
本人QQ:1548742234