問題描述
給一個配置的字符串例如
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ù)是我們需要查找的字符串
-
masktypedefNS_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);
}