Đây là giải pháp của tôi. Về cơ bản, thuật toán đi qua chuỗi tìm kiếm các chuỗi con phù hợp và trả về các kết quả phù hợp đó trong một mảng.
Vì một số NSRange là cấu trúc, nó không thể được thêm trực tiếp vào mảng. Bằng cách sử dụng NSValue, tôi có thể mã hóa khớp đầu tiên và sau đó thêm nó vào mảng. Để truy xuất phạm vi, tôi sau đó giải mã NSValue đối tượng vào một NSRange.
#import <Foundation/Foundation.h>
NSRange makeRangeFromIndex(NSUInteger index, NSUInteger length) {
return NSMakeRange(index, length - index);
}
NSArray<NSValue *> * allLocationsOfStringMatchingSubstring(NSString *text, NSString *pattern) {
NSMutableArray *matchingRanges = [NSMutableArray new];
NSUInteger textLength = text.length;
NSRange match = makeRangeFromIndex(0, textLength);
while(match.location != NSNotFound) {
match = [text rangeOfString:pattern options:0L range:match];
if (match.location != NSNotFound) {
NSValue *value = [NSValue value:&match withObjCType:@encode(NSRange)];
[matchingRanges addObject:value];
match = makeRangeFromIndex(match.location + 1, textLength);
}
}
return [matchingRanges copy];
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *text = @"TATACCATGGGCCATCATCATCATCATCATCATCATCATCATCACAG";
NSString *pattern = @"CAT";
NSArray<NSValue *> *matches = allLocationsOfStringMatchingSubstring(text, pattern);
NSLog(@"Text: %@", text);
NSLog(@"Pattern: %@", pattern);
NSLog(@"Number of matches found: %li", matches.count);
[matches enumerateObjectsUsingBlock:^(NSValue *obj, NSUInteger idx, BOOL *stop) {
NSRange match;
[obj getValue:&match];
NSLog(@" Match found at index: %li", match.location);
}];
}
return 0;
}
lời biện hộ này se làm cho câu hỏi của bạn rõ ràng hơn ... –
tôi sẽ xem xét [NSRegularExpressions] [1] [1]: http://stackoverflow.com/questions/4353834/search-through-nsstring-using- biểu thức chính quy – EricS