效果圖
未命名.gif
功能
1. 將英文字母當(dāng)做全拼匹配中文
2. 將英文字母當(dāng)做拼音首字母匹配中文
3. 中英數(shù)字特殊字符混合匹配
Demo
實(shí)現(xiàn)思路
近日风题,需要為App的搜索功能添加快速匹配列表腹纳,具體需求如下:
- 輸入英文字母匹配對應(yīng)英文
例如 輸入a 匹配到 ask中的a 將a變色- 輸入中文匹配中文
- 輸入英文字母匹配對應(yīng)中文首字母
例如輸入sk 匹配到 失控 時(shí)刻 時(shí)空- 輸入英文匹配對應(yīng)中文全拼 (劃重點(diǎn))
例如輸入 ih 可以匹配到 帝豪(dihao) 你好(nihao)- 混合匹配下基本正確(允許出現(xiàn)少許問題)
解決需求
1:直接調(diào)用rangeofstring方法得到需要變色區(qū)域即可
2:先將雙方字符串統(tǒng)一大小后甘耿,rangeofstring得到變色區(qū)域即可
3:
-
將源字符串的中文轉(zhuǎn)為拼音
NSMutableString *pinyin = [chinese mutableCopy]; CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO); CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformStripCombiningMarks, NO);
-
取得其首字母
[[pinyin substringWithRange:NSMakeRange(0, 1)] uppercaseString];
rangeofstring得到變色區(qū)域
4:
-
得到源字符串轉(zhuǎn)換的全拼字符串
你好授瘦,少年 nihao,shaonian
生成源字符串和全拼字符串的對應(yīng)關(guān)系字典
94001D19-7FC7-4A9A-A68E-BE75663A436B.png
如圖得到的字典如下
@{
0:[0,1],//你 ni
1:[2,3,4],//好 hao
2:[5],//
3:[6,7,8,9],//少 shao
4:[10,11,12,13] //年
};
-
獲得輸入的字母在全拼字符串中的位置 (例如輸入為ih)
[@"nihao,shaonian" rangeOfString:@"ih"]; 根據(jù)range得出位置為1,2
-
利用得出的位置匹配上述字典的值
1 位于 0:[0,1]中 則得到對應(yīng)源字符串位置 --> 0(你) 2 位于 1:[2,3,4]中 則得到對應(yīng)源字符串位置 --> 1(好) 生成源字符串對應(yīng)的range
利用得出的源字符串的range變色即可
5:因?yàn)樵谛枨?的解決方案中對應(yīng)的特殊字符也寫入了全拼字符串质礼,則已經(jīng)可以解決此需求
其中遭遇的坑
-
CFStringTransform得到中文的拼音
你會(huì)發(fā)現(xiàn)"沈沈"被識(shí)別為“chenchen”
”女“被識(shí)別為”nu“鲫骗,這個(gè)是因?yàn)槠滢D(zhuǎn)為的拼音帶了聲調(diào)符,在去掉聲調(diào)符的時(shí)E5AB04DB-47DD-4A84-820F-DA8EE6667642.png
上的兩點(diǎn)也被去掉了 所以就變成了u杠人,所以這個(gè)bug運(yùn)用系統(tǒng)的轉(zhuǎn)換是無法解決的勋乾,只能等待系統(tǒng)更新 直接使用3的時(shí)候會(huì)出現(xiàn) 如果文本為“的到都”,搜索文字為“都”時(shí)嗡善,會(huì)將“的到都”都匹配到辑莫,因?yàn)檫\(yùn)用了首字母匹配,所有在搜索文字僅僅為中文時(shí)罩引,不能啟用首字母匹配各吨,混合的時(shí)候出現(xiàn)此種情況暫時(shí)無法避免。