2

たとえば、 NSString があります"This is my question"。文字/部分文字列のすべてのインデックスを見つけたいです。"i"つまり、この場合、インデックスが から始まる場合、答えとして0欲しいです2,5,16

4

5 に答える 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);
            }
        }

編集

を使用NSRegularExpressionNSRangeて、このようにすることができます。

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 に答える