做项目中意外碰到了这个,因为原本是一个关键字,后改为多个关键字,以空格分开。所以做了这部分,遇到这个问题,也不难,就是正则表达式加上NSMutableString的用法。
现在就来记载一下吧,记性不好,防止以后忘记,PS:其实我也不太明白具体过程,但是大概知道一些,就将我所知道的简述一下吧,勿喷。
首先需要个方法,方法传入searchBar的内容
在第一步,需要以空格分割字符串,将各个关键字筛选出来,我用了NSArray来存储各个关键字。
很简单的,就是一个方法就ok了。公司不允许上传代码,所以这里简单的手打一下方法名字。
//去掉searchBar里的关键字收尾空格。(keyWord 是带空格的多个关键字字符串)
keyWord = [ [keyWord stringByTrimmingCharactersInset:[NSCharcterSet whitespaceCharacterSet ] ];
NSArray *keywords = [ [NSArray alloc] init];
if ( keyWord.length > 0 )
{
//获得关键字,去掉searchBar里的关键字空格。
keywords = [self removeSpaceInString: keyword];
}
//实例化一个MuatableAttributedString。(strText 是搜索出的内容,包含多个关键字)
NSMutableAttributedString *attributedString = [ [NSMutableString alloc] initWithString: strText ]
//标红搜素出内容里关键字部分
for (NSString *temp in keywords)
{
//实例化以每个关键字作为pattern
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: temp options: NSRegularExpressionCaseInsensitive error: nil ];
if ( regex != nil )
{
NSArray *array = [ regex matchesInString: strText options: 0 range: NSMakeRange(0, [strText length]) ];
for ( int i = 0; i < [array count]; i++)
{
NSRange range = [ [array objectAtIndex: i] rangeAtIndex: 0];
if ( range.location != NSNotFound )
{
[attributeString beginEditing];
[attributeString addAttribute: NSForegroundColorAttributeName value: [UIColor redColor] range: range];
[attributeString endEditing];
}
}
}
}
return [attributeString autorelease];
以上就是方法了,返回的attributeString就是标记后的搜索内容,直接赋给控件的.attributedText属性输出就可以了。
对于NSMuatableAttributedString我也没怎么常用,但是经常能看到对于一些字符串效果用到这一类,恩,有时间还是看看吧。还有这个方法不唯一,对于分隔字符串得到关键字NSRange的方法也不唯一,这里是用到正则表达式来分割的。看到网上还有其他的比如NSPredicate可以用来查询和搜索特定字符串。应该也可以做到如上。
==================================我是卡哇伊的分割线=================================
时隔多长时间来着···我又回来了,经过今天修改bug终于明白了多个关键字的方法原理:
赘述如下:这里
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: temp options: NSRegularExpressionCaseInsensitive error: nil ];
主要是用来将关键字作为一个正则表达式
NSArray *array = [ regex matchesInString: strText options: 0 range: NSMakeRange(0, [strText length]) ];
这里主要是将做好的正则表达式,用于匹配字符串中的关键字,这里的array存储的对象类型其实是NSSimpleRegularExpressionCheckingResult类,它是正则表达式的执行结果类,不熟悉或者不造的童鞋可以查看苹果官方文档。这个类有个方法 NSRange range = [ [array objectAtIndex: i] rangeAtIndex: 0];就是这里的rangeAtIndex这个方法,一般取值0的时候是返回结果类型代表范围。所以这里的range其实就是找到的关键字位置范围,通过for循环,逐一获得位置,用 [attributeString addAttribute: NSForegroundColorAttributeName value: [UIColor redColor] range: range];将该范围的字符串(也就是关键字)标红或者高亮。
这就是整个关键字标红的过程。
另外注意:正则表达式由于有自己的语法和关键字,所以对于一些特殊字符需要做转义处理,否则系统将认为这样的关键字不能作为一个正则表达式。附特殊字符:
"$", "(", ")", "*", "+", ".", "[", "]", "?", "\\", "^", "{", "}", "|",""