前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【已解决】怎么获取字符串中相同字符串第N 个所在的位置

【已解决】怎么获取字符串中相同字符串第N 个所在的位置

作者头像
君赏
发布2018-09-07 11:01:52
2.4K0
发布2018-09-07 11:01:52
举报
文章被收录于专栏:君赏技术博客君赏技术博客

问题描述

给一个配置的字符串例如

代码语言:javascript
复制
NSString *string = @"34563879-+4561346573";

现在我想获取到字符串第3个字符串3所在的位置。

对于我们经常用的rangeOfString这个方法只能获取最近的一次出现的位置,而不能指定第几个出现的位置。

查看关于 NSString里面其他不经常用到的 API,还真找到一个相似的方法。

代码语言:javascript
复制
- (NSRange)rangeOfString:(NSString *)searchString 
                options:(NSStringCompareOptions)mask 
                  range:(NSRange)rangeOfReceiverToSearch
  • searchString 这个参数是我们需要查找的字符串
  • mask typedefNS_OPTIONS(NSUInteger, NSStringCompareOptions) { NSCaseInsensitiveSearch = 1, //不区分大小写比较 NSLiteralSearch = 2, //逐字节比较 区分大小写 NSBackwardsSearch = 4, //从字符串末尾开始搜索 NSAnchoredSearch = 8, //搜索限制范围的字符串 NSNumericSearch = 64, //按照字符串里的数字为依据,算出顺序。例如 Foo2.txt < Foo7.txt < Foo25.txt NSDiacriticInsensitiveSearchNS_ENUM_AVAILABLE(10_5, 2_0) = 128,//忽略 "-" 符号的比较 NSWidthInsensitiveSearchNS_ENUM_AVAILABLE(10_5, 2_0) = 256,//忽略字符串的长度,比较出结果 NSForcedOrderingSearchNS_ENUM_AVAILABLE(10_5, 2_0) = 512,//忽略不区分大小写比较的选项,并强制返回 NSOrderedAscending 或者 NSOrderedDescending NSRegularExpressionSearchNS_ENUM_AVAILABLE(10_7, 3_2) = 1024 //只能应用于 rangeOfString:..., stringByReplacingOccurrencesOfString:...和 replaceOccurrencesOfString:... 方法。使用通用兼容的比较方法,如果设置此项,可以去掉 NSCaseInsensitiveSearch 和 NSAnchoredSearch };
  • rangeOfReceiverToSearch 需要搜索在源字符串所在的范围

例子方法

代码语言:javascript
复制
- (NSRange)rangeOfString:(NSString *)string
                 atIndex:(NSUInteger)index
          inResultString:(NSString *)resultString {
    NSUInteger indexCount = 0;
    NSRange findRange = NSMakeRange(0, resultString.length);
    while (YES) {
        NSRange rangeString = [resultString rangeOfString:string
                                                  options:NSLiteralSearch
                                                    range:findRange];
        if (rangeString.location == NSNotFound) {
            return rangeString;
        }
        indexCount ++;
        if (indexCount == index) {
            return rangeString;
        }
        findRange = NSMakeRange(NSMaxRange(rangeString), resultString.length - NSMaxRange(rangeString));
    }
    return NSMakeRange(NSNotFound, 0);
}

简单的测试用例

代码语言:javascript
复制
- (void)testRangeOfString {
    /* 查找第一个1 */
    BOOL result1 = [self isEqualTrue:@"1"
                            atIndedx:1
                        compareRange:NSMakeRange(0, 1)];
    XCTAssertTrue(result1);
    
    BOOL result2 = [self isEqualTrue:@"1"
                            atIndedx:2
                        compareRange:NSMakeRange(4, 1)];
    XCTAssertTrue(result2);
    
    BOOL result3 = [self isEqualTrue:@"123"
                            atIndedx:1
                        compareRange:NSMakeRange(NSNotFound, 0)];
    XCTAssertTrue(result3);
    
    BOOL result4 = [self isEqualTrue:@"1"
                            atIndedx:3
                        compareRange:NSMakeRange(15, 1)];
    XCTAssertTrue(result4);
    
}

- (BOOL)isEqualTrue:(NSString *)findString
           atIndedx:(NSUInteger)index
       compareRange:(NSRange)compareRange {
    NSRange findRange = [self rangeOfString:findString
                                    atIndex:index
                             inResultString:@"13221454366+5331"];
    return NSEqualRanges(findRange, compareRange);
}

解决办法

代码语言:javascript
复制
- (NSRange)rangeOfString:(NSString *)string
                 atIndex:(NSUInteger)index
          inResultString:(NSString *)resultString {
    NSUInteger indexCount = 0;
    NSRange findRange = NSMakeRange(0, resultString.length);
    while (YES) {
        NSRange rangeString = [resultString rangeOfString:string
                                                  options:NSLiteralSearch
                                                    range:findRange];
        if (rangeString.location == NSNotFound) {
            return rangeString;
        }
        indexCount ++;
        if (indexCount == index) {
            return rangeString;
        }
        findRange = NSMakeRange(NSMaxRange(rangeString), resultString.length - NSMaxRange(rangeString));
    }
    return NSMakeRange(NSNotFound, 0);
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.06.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
    • 例子方法
      • 简单的测试用例
      • 解决办法
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档