蚓無爪牙之利,筋骨之強,上食埃土,下飲黃泉,用心一也。
前言
今天老高突然問我一個問題,查詢字符串的位置,且是所有位置。有點繞口,舉個例子:
現(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。
上面的方法可以指定搜索范圍,那就遞歸改變搜索范圍方式進行搜索。整體代碼如下:
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:

1.png
-
方法二
使用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:

2.png
后記
可能還有其他種方法,以后看到后再做整理,歡迎大佬留言。