我正在尝试解析一个字符串并获取其中的另一个字符串。
例如:
Hello world this is a string
我需要找到 "world" 和 "is"(this)之间的字符串。我已经搜索了一些资料,但由于我对Objective C还很陌生,所以还没有找到如何实现这个功能。有没有人知道如何使用正则表达式或其他方法实现?
我正在尝试解析一个字符串并获取其中的另一个字符串。
例如:
Hello world this is a string
我需要找到 "world" 和 "is"(this)之间的字符串。我已经搜索了一些资料,但由于我对Objective C还很陌生,所以还没有找到如何实现这个功能。有没有人知道如何使用正则表达式或其他方法实现?
Jacques提供的正则表达式解决方案是有效的,需要iOS 4.0及更高版本。使用正则表达式也相当慢,并且在搜索表达式是已知字符串常量时会过度使用。
你可以使用NSString
上的方法或名为NSScanner
的类来解决该问题。它们自iPhone OS 2.0以来一直可用,而且在此之前很久就已经存在了,实际上是在Mac OS X 10.0之前就有了 :)
所以你想要一个像这样的NSString
新方法吗?
@interface NSString (CWAddition)
- (NSString*) stringBetweenString:(NSString*)start andString:(NSString*)end;
@end
没有问题,我们假设如果找不到这样的字符串,应该返回nil
。
使用NSString
的实现非常直接:@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
你可以使用NSScanner
类进行实现:
@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
这是对 PeyloW 回答的简单修改,它返回在起始字符串和结束字符串之间的所有字符串:
-(NSMutableArray*)stringsBetweenString:(NSString*)start andString:(NSString*)end
{
NSMutableArray* strings = [NSMutableArray arrayWithCapacity:0];
NSRange startRange = [self rangeOfString:start];
for( ;; )
{
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;
[strings addObject:[self substringWithRange:targetRange]];
NSRange restOfString;
restOfString.location = endRange.location + endRange.length;
restOfString.length = [self length] - restOfString.location;
startRange = [self rangeOfString:start options:0 range:restOfString];
}
else
{
break;
}
}
else
{
break;
}
}
return strings;
}
请参阅ICU正则表达式用户指南。
如果您知道只会有一个结果:
NSRegularExpression *regex = [NSRegularExpression
regularExpressionWithPattern:@"\bworld\s+(.+)\s+is\b" options:0 error:NULL]
NSTextCheckingResult *result = [regex firstMatchInString:string
options:0 range:NSMakeRange(0, [string length]];
// Gets the string inside the first set of parentheses in the regex
NSString *inside = [string substringWithRange:[result rangeAtIndex:1]];
[string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]
或者
NSMutableArray *parts = [NSMutableArray arrayWithCapacity:1];
NSScanner *scanner = [NSScanner scannerWithString:string];
NSString *token;
while ([scanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceCharacterSet]] intoString:&token]) {
[parts addObject:token];
}