蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。
前言
今天老高突然问我一个问题,查询字符串的位置,且是所有位置。有点绕口,举个例子:
现有字符串abc is abc, and abc
,查找abc
的所有range
。
正文
首先大脑的第一反应rangeOfString
是不能实现的,该方法是找第一出现的range。于是,稍加思考,再一百度总结出下面2种方法。
-
方法一
换个方法,使用
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch;
后面2个参数
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];
}
打印结果如图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);
}
打印结果如图2:
后记
可能还有其他种方法,以后看到后再做整理,欢迎大佬留言。