在字符串中标记(高亮)多个关键字

     做项目中意外碰到了这个,因为原本是一个关键字,后改为多个关键字,以空格分开。所以做了这部分,遇到这个问题,也不难,就是正则表达式加上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];将该范围的字符串(也就是关键字)标红或者高亮。

这就是整个关键字标红的过程。

另外注意:正则表达式由于有自己的语法和关键字,所以对于一些特殊字符需要做转义处理,否则系统将认为这样的关键字不能作为一个正则表达式。附特殊字符:

"$", "(", ")", "*",  "+", ".", "[", "]", "?", "\\", "^", "{", "}", "|",""

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值