美文网首页成长笔记MacOS开发 技术集锦iOS开发 技术集锦
【已解决】怎么获取字符串中相同字符串第N 个所在的位置

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

作者: 君赏 | 来源:发表于2018-06-21 09:12 被阅读12次

    问题描述

    给一个配置的字符串例如

    NSString *string = @"34563879-+4561346573";
    

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

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

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

    - (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

      需要搜索在源字符串所在的范围

    例子方法

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

    简单的测试用例

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

    解决办法

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/izzfyftx.html