蚓無爪牙之利桃笙,筋骨之強鼠锈,上食埃土购笆,下飲黃泉同欠,用心一也铭乾。
前言
今天老高突然問我一個問題,查詢字符串的位置,且是所有位置泉沾。有點繞口跷究,舉個例子:
現(xiàn)有字符串abc is abc, and abc
,查找abc
的所有range
柴我。
正文
首先大腦的第一反應(yīng)rangeOfString
是不能實現(xiàn)的,該方法是找第一出現(xiàn)的range界睁。于是晕窑,稍加思考敞斋,再一百度總結(jié)出下面2種方法植捎。
-
方法一
換個方法,使用
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch;
后面2個參數(shù)
mask: 搜索方式济锄;
rangeOfReceiverToSearch:搜索范圍;
對NSStringCompareOptions不是很了解的小伙伴可以查看筆者之前的文章 —— iOS NSStringCompareOptions低滩。
上面的方法可以指定搜索范圍恕沫,那就遞歸改變搜索范圍方式進(jìn)行搜索婶溯。整體代碼如下:
NSString *text = @"abc is abc, and abc";
NSString *searchStr = @"abc";
NSRange range = [text rangeOfString:searchStr];
while (range.location != NSNotFound || range.length != 0) {
NSLog(@">>>1:%@", NSStringFromRange(range));
NSUInteger hadSearchedRange = range.location + range.length;
NSRange resetRange = NSMakeRange(hadSearchedRange, text.length - hadSearchedRange);
range = [text rangeOfString:searchStr options:NSCaseInsensitiveSearch range:resetRange];
}
打印結(jié)果如圖1:
-
方法二
使用NSRegularExpression
,更加高級的類腾它,里面有更加高級的api跑筝,不多嗶嗶,上代碼:
NSString *text = @"abc is abc, and abc";
NSError *error;
NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:@"abc"
options:NSRegularExpressionCaseInsensitive error:&error];
if (!error) {
NSArray *results = [regular matchesInString:text options:NSMatchingReportProgress range:NSMakeRange(0,
text.length)];
for (NSTextCheckingResult *result in results) {
NSLog(@">>>2:%@", NSStringFromRange(result.range));
}
}
else {
NSLog(@"%@", error);
}
打印結(jié)果如圖2:
后記
可能還有其他種方法瞒滴,以后看到后再做整理曲梗,歡迎大佬留言。