iOS 尋找字符串中重復(fù)字符串的NSRange/Range(朋友圈,微信,點擊人名效果)

如何在一個字符串中尋找到你想要的字符串(目標(biāo)字符串)的所有位置?

例如: 在下面字符串中找到所有"我是"的 range

string = "...我是....是,,,,,...我是,,.是,,..我是...不...是,,,,.我...,,我是.."

swift4.2

    func findAimstrAllRange(baseStr : NSString, aimStr: String, baseRange : NSRange, result : inout Array<NSRange>) -> Array<NSRange> {

        let range = baseStr.range(of: aimStr, options: NSString.CompareOptions.literal, range: baseRange)
        //找到
        if range.length > 0{
            result.append(range)
            let detectLength = range.location + range.length
            let rangeNew = NSRange(location: detectLength, length: baseStr.length - detectLength)
            _ = findAimstrAllRange(baseStr: baseStr, aimStr: aimStr, baseRange: rangeNew, result: &result)
        }
        return result
    }

//使用
    let baseStr = "...我是....是,,,,,...我是,,.是,,..我是...不...是,,,,.我...,,我是.." as NSString
    let aimStr = "我是"
    var rangeArr = Array<NSRange>()
    let result = findAimstrAllRange(baseStr: baseStr, aimStr: aimStr, baseRange: NSRange(location:0, length: baseStr.length), result: &rangeArr)
    print(result)
    

Objective-C

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *baseStr = @"...我是....是,,,,,...我是,,.是,,..我是...不...是,,,,.我...,,我是..";
    NSString *aimStr = @"我是";
    NSMutableArray *result = [NSMutableArray array];
    result =  [self findAimstrAllRangeWithBaseStr:baseStr andAimStr:aimStr andBaseRange:NSMakeRange(0, baseStr.length) resultArr:result];
    NSLog(@"%@",result);
}



-(NSMutableArray *)findAimstrAllRangeWithBaseStr:(NSString *)baseStr andAimStr:(NSString*)aimStr andBaseRange:(NSRange)baseRange resultArr:(NSMutableArray *)resultArr
{
   
    NSRange range = [baseStr rangeOfString:aimStr options:NSLiteralSearch range:baseRange];
    if (range.length > 0) {
        [resultArr addObject:NSStringFromRange(range)];
        NSUInteger nextLocation = range.location + range.length;
        NSRange rangeNew = NSMakeRange(nextLocation, baseStr.length - nextLocation);
        [self findAimstrAllRangeWithBaseStr:baseStr andAimStr:aimStr andBaseRange:rangeNew resultArr:resultArr];
    }
    return resultArr;
}

應(yīng)用案例

實現(xiàn)微信點贊列表, 點擊人名對應(yīng)跳轉(zhuǎn)相應(yīng)的個人界面
方式一: label 中實現(xiàn)點擊文字: 使用 YYLabel(需要傳遞 range 參數(shù))
方式二: UITextView 實現(xiàn)點擊文字,原生方法(同樣需要 range 參數(shù))


//稍微對上述方法進(jìn)行修改
 func findAimstrAllRange(baseStr : NSString, aimStr: String, baseRange : NSRange, result : inout Array<NSRange>) -> Array<NSRange> {

        let range = baseStr.range(of: aimStr, options: NSString.CompareOptions.literal, range: baseRange)

        if result.contains(range) == false {
            result.append(range)
            return result
        }else{
            //找到
            if range.length > 0{
                let detectLength = range.location + range.length
                let rangeNew = NSRange(location: detectLength, length: baseStr.length - detectLength)
                _ = findAimstrAllRange(baseStr: baseStr, aimStr: aimStr, baseRange: rangeNew, result: &result)
            }
        }
        return result
    }



 let testArr = ["小明","小紅","小綠","小紅","小花","小明"]

//把人名數(shù)組通過 split 變成 baseStr
 let baseStr = "小明,小紅,小綠,小紅,小花,小明" as NSString
 var rangeArr = Array<NSRange>()
 for str in testArr{
       let arr = findAimstrAllRange(baseStr: baseStr, aimStr: str, baseRange: NSRange(location:0, length: baseStr.length), result: &rangeArr)
       print("姓名 = \(str)" + ", 位置 = \(String(describing: arr.last))")
 }


//知道 range 后就可以在對應(yīng)的 range 上添加點擊方法,并且添加 attribute 
baseAttributeStr.addAttribute(NSAttributedString.Key.link, value:(用戶 id, 或者其他數(shù)據(jù)), range: range)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挖炬,更是在濱河造成了極大的恐慌扇住,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸡岗,居然都是意外死亡场勤,警方通過查閱死者的電腦和手機戈锻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門介汹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舶沛,你說我怎么就攤上這事嘹承。” “怎么了如庭?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵叹卷,是天一觀的道長。 經(jīng)常有香客問我坪它,道長骤竹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任往毡,我火速辦了婚禮蒙揣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘开瞭。我一直安慰自己懒震,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布嗤详。 她就那樣靜靜地躺著个扰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪葱色。 梳的紋絲不亂的頭發(fā)上递宅,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音苍狰,去河邊找鬼办龄。 笑死,一個胖子當(dāng)著我的面吹牛淋昭,可吹牛的內(nèi)容都是我干的俐填。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼响牛,長吁一口氣:“原來是場噩夢啊……” “哼玷禽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呀打,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤矢赁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贬丛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撩银,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年豺憔,在試婚紗的時候發(fā)現(xiàn)自己被綠了额获。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片够庙。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抄邀,靈堂內(nèi)的尸體忽然破棺而出耘眨,到底是詐尸還是另有隱情,我是刑警寧澤境肾,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布剔难,位于F島的核電站,受9級特大地震影響奥喻,放射性物質(zhì)發(fā)生泄漏偶宫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仰禽,春花似錦、人聲如沸撑刺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至桦锄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔫耽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工留夜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匙铡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓碍粥,卻偏偏與公主長得像鳖眼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嚼摩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 圣誕節(jié)
    八角貓閱讀 226評論 0 0
  • 沒有記錄钦讳,就沒有發(fā)生!(本周關(guān)鍵詞:論文答辯枕面、論文材料愿卒、好友生日、音樂節(jié)) 【木羽90天踐行目標(biāo)】 0424-07...
    木羽盒子閱讀 170評論 0 0
  • 餐桌上除了擺著我的電腦柜候,還放著很多與寫作不相干的奶瓶搞动、燒水壺、熱水壺渣刷、幾個人的水杯鹦肿、零零散散的水果。在這一片散亂中...
    瑩瑩_閱讀 465評論 5 3
  • 今天我要感謝自己辅柴,感謝自己能夠開始懂得寬容箩溃,人與人的三觀也許本就不同,也許別人就是一個只顧自己的人碌识,如果自己不能夠...
    人言白一閱讀 231評論 0 0