1. 程式人生 > >在字串中標記(高亮)多個關鍵字

在字串中標記(高亮)多個關鍵字

     做專案中意外碰到了這個,因為原本是一個關鍵字,後改為多個關鍵字,以空格分開。所以做了這部分,遇到這個問題,也不難,就是正則表示式加上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];將該範圍的字串(也就是關鍵字)標紅或者高亮。

這就是整個關鍵字標紅的過程。

另外注意:正則表示式由於有自己的語法和關鍵字,所以對於一些特殊字元需要做轉義處理,否則系統將認為這樣的關鍵字不能作為一個正則表示式。附特殊字元:

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

相關推薦

字串標記關鍵字

     做專案中意外碰到了這個,因為原本是一個關鍵字,後改為多個關鍵字,以空格分開。所以做了這部分,遇到這個問題,也不難,就是正則表示式加上NSMutableString的用法。     現在就來記載一下吧,記性不好,防止以後忘記,PS:其實我也不太明白具體過程,但是大

使Atom支援微信小程式程式碼格式wxml,wxss有顏色

在用Atom來瀏覽或者編輯微信小程式時的介面時全灰色文字怎麼辦?!! 如何讓wxml和wxs格式的程式碼像HTML,CSS變成高亮的呢。。 就像這樣 ↓↓↓↓↓↓↓ 修改步驟如下 1.在Atom中裝

Vue 選單欄點選切換單個class,超簡單!

步驟: 遍歷物件(goods)獲取選單欄每一項的物件(item)和下標(index) 新增點選事件toggle(),傳入下標引數:@click="fn1();fn2()" 動態切換classname::class="{'active':index ==che

android語言專案字串的移植bash工具

有時候我們會遇到這樣一種情況:一些字串資源要從原始專案A移植到現在我們開發的專案B中比如移植app名字<string name="app_label">Calendar</string>我們需要做的是:在新專案對應的語言資源中查詢是否有app_labe

java比較兩字串完全不同處顯示過濾了某些字串前面不不相干字元

java比較兩個字串完全不同處高亮顯示(過濾了某些字串前面不相干字元) 歡迎各位使用並優化,因為我也不太清楚這裡面是不是有嚴重的問題,後期我會再度優化的,寫這個東西主要是因為在網上很難找到類似的東西= =。 再說一句,請各位大佬帶我飛好嘛!!畢竟我是個小碼農

程式設計珠璣求一個字串連續出現的次數最的子串

這個題目不是程式設計珠璣上看到的,但是解法用到的資料結構在程式設計珠璣上有講到,先歸類到這裡。 求一個字串中連續出現的次數最多的子串。例如字串“abababc”,最多連續出現的為ab,連續出現三次。要和求一個字串中的最長重複子串區分開來,還是上面的字串,那麼最長的重複子串為

c語言 陣列字串的旋轉左旋右旋

     在陣列中定義一個字串,該字串由“ abcdef ” 組成,所謂左旋即是讓左邊的第一個字元旋轉到右邊去,左旋一個字元即是產生“ bcdefa ”這樣的字串,右旋與之相反。      為了控制左(右)旋的字元數,需要製作一個可以改

常用正則表示式,markdown

校驗數字的表示式 1 數字:^[0-9]*$ 2 n位的數字:^\d{n}$ 3 至少n位的數字:^\d{n,}$ 4 m-n位的數字:^\d{m,n}$ 5 零和非零開頭的數字:^(0|[1-9][0-9]*)$ 6 非零開頭的最多帶兩位小數的數字:^([1-9][0-9]*)+(

迴文判斷程式碼可以忽略字串的空格,標點符號,舉例子啊,abcddcba就是一個迴文。a b cd,dc ba也是一個迴文。

#include<stdio.h> #include<string.h> #define N 100 int main() { char a[N]; char b[N]; int len; int j = 0; 

Android 魔術字型按鈕,陰影效果

    效果如下,封裝記錄原始碼:        double_arrow.png    圖示資源   介面: <LinearLayout

Sping singleton單例和 prototype 的理解

Singleton: 當一個 bean 的作用域為 singleton(單例)時,IOC 容器中只會存在一個共享的 bean 例項,且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一例項。也就是說,這個單一例項被儲存到單例快取中,以

Qt 之 QSS語法

簡述 語法高亮是文字編輯器用來顯示文字的,特別是原始碼,根據不同的類別來用不同的顏色和字型顯示。這個功能有助於編寫結構化的語言,例如:程式語言、標記語言,這些語言的語法錯誤顯示是有區別的。 | 詳細描述 語法高亮

二、k8s1.12 master節點可用

架構圖 master 節點我們要避免單節點,防止故障 1、多節點部署 我們在192.168.1.9上面部署另外一臺master 首先我們將主節點檔案拷貝過去: cd /opt scp -r kubernetes 192.168.1.9:/opt/ scp -r

python字串的翻轉方法總結

Python翻轉字串(reverse string), 一共包含5種方法, 其中第一種最簡單, 即步長為-1, 輸出字串; 方法如下 5種方法的比較: 1. 簡單的步長為-1, 即字串的翻轉(常用)

LeetCode | Reverse Words in a String字串的單詞序反轉

Given an input string, reverse the string word by word. For example, Given s = "the sky is blue", return "blue is sky the". Clarific

mac下vim的16種配色方案程式碼展示,及配置

下面給大家展示一下mac下所有vim的配色方案的樣式。 darkblue  delek  elflord  koehler  murphy  peachpuff  sh

7-8 單詞長度15 分字串的單詞提取出來

#include <bits/stdc++.h> using namespace std; int main() { string str, buf;//字串型別,長度不定 int n; getline(cin, str);//讀入字串

一步一步教你寫股票走勢圖——分時圖四聯動

前一節我們學習了有關柱狀圖的高亮自定義,那麼這一節我們來搞一搞兩張圖表的聯動效果,先看一下我們要實現的效果。 我們要實現兩張圖表之間建立了連線,我們滾動高亮第一張圖,第二張圖表的高亮也會跟著動,滾動第二張圖表第一張要跟著動。 分析原始

在ASP.NET MVC 模型 選擇最好的方法將model資料模型傳遞到檢視

無論你什麼時候需要保持一些資訊直到一個接著的後來的請求,使用TempData都是很好的方法。它應該在你需要保持例如驗證資訊,錯誤資訊,或者一些小的不包含敏感資料資訊的時候使用。因為它能保證會話來傳遞變數,所以你不應該把敏感的資訊存放在TempData。 (adsbygoogle =

C和C++字串String字串字面量String Literal的區別

轉自:http://www.360doc.com/content/12/0511/19/7775902_210379219.shtml C/C++中的物件指的是一塊儲存區。字串字面量是不需要建立過程就可以使用的物件,所以它既沒有變數那樣的宣告或者定義(字串字面量是無名物件