たとえば、 NSString があります"This is my question"
。文字/部分文字列のすべてのインデックスを見つけたいです。"i"
つまり、この場合、インデックスが から始まる場合、答えとして0
欲しいです2,5,16
。
10930 次
5 に答える
4
他の答えは少しやり過ぎです。次のように単純に文字を反復処理してみませんか。
NSString *x = @"This is my question";
for (NSUInteger i=0;i<[x length];i++)
{
if ([x characterAtIndex:i]=='i')
{
NSLog(@"found: %d", i);
}
}
それはあなたの位置を正確に出力します:
found: 2
found: 5
found: 16
于 2013-05-21T05:11:06.417 に答える
0
これは、あなたが望むものを得るためのノーループコードでの私の試みです。私はこれを盲目的にコーディングしました。つまり、テストされていないなどです。基本的には再帰関数ですが、一般的なアイデアが得られると思います。
- (NSArray *)getAllEyes:(NSString *)s index:(int)index) {
if (!s || s.length <= 0 || index >= s.length) return [NSArray new];
NSRange *r = [s rangeOfString(@"i") options:NSLiteralSearch range:NSMakeRange(index, s.length - index)];
if (r.location == NSNotFound) {
return [NSArray new];
} else {
NSMutableArray *array = [NSMutableArray new];
[array addObject:@(r.location)];
[array addObjectsFromArray:[self getAllEyes:s index:r.location + 1]];
return array;
}
}
// usage:
NSArray *allEyes = [self getAllEyes:@""];
for (NSNumber *n in allEyes) {
NSLog(@"i = %@", n);
}
于 2013-05-21T05:49:08.837 に答える
0
とループを使用NSRange
し、いくつかの文字列操作を使用すると、簡単に実行できます。
NSString *string = @"This is my question";
NSString *substring = @"i";
NSRange searchRange = NSMakeRange(0,string.length);
NSRange foundRange;
while (searchRange.location < string.length)
{
searchRange.length = string.length-searchRange.location;
foundRange = [string rangeOfString:substring options:nil range:searchRange];
if (foundRange.location != NSNotFound)
{
// found an occurrence of the char
searchRange.location = foundRange.location+foundRange.length;
NSLog(@"Location of '%@' is %d",substring,searchRange.location-1);
}
}
編集
を使用NSRegularExpression
しNSRange
て、このようにすることができます。
NSString *string = @"This is my question";
NSString *substring = @"i";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:substring
options:0
error:NULL];
[regex enumerateMatchesInString:string options:0 range:NSMakeRange(0, [string length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
NSRange range = [result range];
NSLog(@"Location of '%@' is %d",substring, range.location);
}];
出力は
Location of 'i' is 2
Location of 'i' is 5
Location of 'i' is 16
于 2013-05-21T05:12:03.230 に答える