The regular expressions solution that Jacques gives works, and the caveat of requiring iOS 4.0 and later is true, meaning it does not work on current iPads. Using regular expressions is also quite slow, and an overkill if the search expressions are known string constants.
You can solve the problem using methods on NSString
, or a class named NSScanner
, both have been available since iPhone OS 2.0 and long before that, since before Mac OS X 10.0 actually :).
So what you want is a new method on NSString
like this?
@interface NSString (CWAddition)
-(NSString*)stringBetweenString:(NSString*)start andString:(NSString)end;
@end
No problem, and we assume we should return nil
is no such strings could be found.
The implementation using NSString
only is quite straight forward:
@implementation NSString (NSAddition)
-(NSString*)stringBetweenString:(NSString*)start andString:(NSString)end {
NSRange startRange = [self rangeOfString:start];
if (startRange.location != NSNotFound) {
NSRange targetRange;
targetRange.location = startRange.location + startRange.length;
targetRange.length = [self length] - targetRange.location;
NSRange endRange = [self rangeOfString:end options:0 range:targetRange];
if (endRange.location != NSNotFound) {
targetRange.length = endRange.location - targetRange.location;
return [self substringWithRange:targetRange];
}
}
return nil;
}
@end
Or you could do the implementation using the NSScanner
class:
@implementation NSString (NSAddition)
-(NSString*)stringBetweenString:(NSString*)start andString:(NSString)end {
NSScanner* scanner = [NSScanner scannerWithString:self];
[scanner setCharactersToBeSkipped:nil];
[scanner scanUpToString:start intoString:NULL];
if ([scanner scanString:start intoString:NULL]) {
NSString* result = nil;
if ([scanner scanUpToString:end intoString:&result]) {
return result;
}
}
return nil;
}
@end