Iphone 获取ObjC中其他两个字符串之间的字符串 我试图解析一个字符串并在中间获得另一个字符串。< /P>
即 你好,世界,这是一个字符串 我需要找到“世界”和“是”(这个)之间的字符串。我环顾四周,但还没有弄清楚,主要是因为我还不熟悉客观世界。。。有人知道如何使用正则表达式或不使用正则表达式吗?请参阅 如果你知道结果只有一个:Iphone 获取ObjC中其他两个字符串之间的字符串 我试图解析一个字符串并在中间获得另一个字符串。< /P>,iphone,objective-c,Iphone,Objective C,即 你好,世界,这是一个字符串 我需要找到“世界”和“是”(这个)之间的字符串。我环顾四周,但还没有弄清楚,主要是因为我还不熟悉客观世界。。。有人知道如何使用正则表达式或不使用正则表达式吗?请参阅 如果你知道结果只有一个: NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\bworld\s+(.+)\s+is\b" options:0 error:NULL] NSTextC
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]];
\b确保在world之前和is之后有一个单词边界(因此“hello world this not a string”不匹配)。在world之后和is之前\s会吞噬所有空格。这个?找到你要找的东西,用?使其非贪婪,这样“hello world这是一个字符串hello world这是一个字符串”不会给你“this a string hello world this”
我将让您自己决定如何处理多个匹配项。NSRegularExpression文档应该可以帮助您解决此问题
如果要确保匹配不跨越句子边界,可以使用([^.]+?)而不是(+.+?),或者可以在字符串上使用EnumerateSubstringsRange:options:usingBlock:,并在选项中传递NSStringEnumerationByEntences
这些东西都需要4.0+。如果您想支持3.0+,请查看RegexKitLite。如果它恰好是由空格分隔的字符串,您可以使用以下代码:或者
[string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]
或
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;
}
请注意,此解决方案不能确保world和is位于单词边界上。您可以添加更多代码来处理这一问题,但这可能会很棘手,因此我建议只使用正则表达式(NSRegularExpression或RegexKitLite for iOS 3)来简化处理所有紧急情况的过程。做一些分析,看看你是否需要手工编写一个解决方案。谢谢!我还要找到出现多次的字符串。。。HelloBye我假设我可以添加另一个参数(出现),然后循环开始字符串X次,对吗?我应该能够找到答案,特别是因为您给了我NSRange等的起点。再次感谢!是的,应该没问题。只需使用上一次搜索的范围来限制下一次搜索的搜索范围。答案很好,但在NSString扩展解决方案中,您应该防止在NSRange endRange=[self rangeOfString:end options:0 range:targetRange]之前找不到这样的结束字符串;语句,否则它将崩溃:NSRange checkEndRange=[self rangeOfString:end];如果(checkEndRange.location!=NSNotFound),感谢您的帮助!我需要支持OS3/iPad,所以这不是目前的选择。一旦iPadOS4面世,我就可以使用Regex切换到这个实现。。再添加一个参数作为“originalString”,并用它替换“self”。
-(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;
}