【已解決】怎么獲取字符串中相同字符串第N 個所在的位置

問題描述

給一個配置的字符串例如

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

現(xiàn)在我想獲取到字符串第3個字符串3所在的位置。

對于我們經(jīng)常用的rangeOfString這個方法只能獲取最近的一次出現(xiàn)的位置,而不能指定第幾個出現(xiàn)的位置。

查看關(guān)于 NSString里面其他不經(jīng)常用到的 API,還真找到一個相似的方法。

- (NSRange)rangeOfString:(NSString *)searchString 
                options:(NSStringCompareOptions)mask 
                  range:(NSRange)rangeOfReceiverToSearch
  • searchString

    這個參數(shù)是我們需要查找的字符串

  • mask

    typedefNS_OPTIONS(NSUInteger, NSStringCompareOptions) {
        NSCaseInsensitiveSearch = 1,    //不區(qū)分大小寫比較
        NSLiteralSearch = 2,    //逐字節(jié)比較 區(qū)分大小寫
        NSBackwardsSearch = 4,    //從字符串末尾開始搜索
        NSAnchoredSearch = 8,    //搜索限制范圍的字符串
        NSNumericSearch = 64,    //按照字符串里的數(shù)字為依據(jù),算出順序。例如 Foo2.txt < Foo7.txt < Foo25.txt
        NSDiacriticInsensitiveSearchNS_ENUM_AVAILABLE(10_5, 2_0) = 128,//忽略 "-" 符號的比較
        NSWidthInsensitiveSearchNS_ENUM_AVAILABLE(10_5, 2_0) = 256,//忽略字符串的長度,比較出結(jié)果
        NSForcedOrderingSearchNS_ENUM_AVAILABLE(10_5, 2_0) = 512,//忽略不區(qū)分大小寫比較的選項,并強制返回 NSOrderedAscending 或者 NSOrderedDescending
        NSRegularExpressionSearchNS_ENUM_AVAILABLE(10_7, 3_2) = 1024   //只能應(yīng)用于 rangeOfString:..., stringByReplacingOccurrencesOfString:...和 replaceOccurrencesOfString:... 方法。使用通用兼容的比較方法,如果設(shè)置此項,可以去掉 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);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容