如何在一個字符串中尋找到你想要的字符串(目標(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)