iOS 查询字符串的位置

蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。

前言

今天老高突然问我一个问题,查询字符串的位置,且是所有位置。有点绕口,举个例子:
现有字符串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:


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);
}

打印结果如图2:


2.png

后记

可能还有其他种方法,以后看到后再做整理,欢迎大佬留言。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容