如何获取NSString的子串?

Csa*_*abi 78 cocoa-touch objective-c nsstring

如果我想从NSString获取值@"value:hello World:value",我应该使用什么?

我想要的返回值是@"hello World".

Reg*_*ent 157

选项1:

NSString *haystack = @"value:hello World:value";
NSString *haystackPrefix = @"value:";
NSString *haystackSuffix = @":value";
NSRange needleRange = NSMakeRange(haystackPrefix.length,
                                  haystack.length - haystackPrefix.length - haystackSuffix.length);
NSString *needle = [haystack substringWithRange:needleRange];
NSLog(@"needle: %@", needle); // -> "hello World"
Run Code Online (Sandbox Code Playgroud)

选项2:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^value:(.+?):value$" options:0 error:nil];
NSTextCheckingResult *match = [regex firstMatchInString:haystack options:NSAnchoredSearch range:NSMakeRange(0, haystack.length)];
NSRange needleRange = [match rangeAtIndex: 1];
NSString *needle = [haystack substringWithRange:needleRange];
Run Code Online (Sandbox Code Playgroud)

尽管如此,对于你相当琐碎的案例,这个可能有点过头了.

选项3:

NSString *needle = [haystack componentsSeparatedByString:@":"][1];
Run Code Online (Sandbox Code Playgroud)

这个在分割时创建三个临时字符串和一个数组.


所有片段都假设搜索到的内容实际上包含在字符串中.


Sha*_*eal 74

这是一个稍微复杂的答案:

NSString *myString = @"abcdefg";
NSString *mySmallerString = [myString substringToIndex:4];
Run Code Online (Sandbox Code Playgroud)

另请参见substringWithRange和substringFromIndex

  • 抱歉,这不能回答问题(如何从字符串中间获取子字符串)。 (2认同)

Gar*_*ett 16

这是一个简单的功能,可以让你做你想要的:

- (NSString *)getSubstring:(NSString *)value betweenString:(NSString *)separator
{
    NSRange firstInstance = [value rangeOfString:separator];
    NSRange secondInstance = [[value substringFromIndex:firstInstance.location + firstInstance.length] rangeOfString:separator];
    NSRange finalRange = NSMakeRange(firstInstance.location + separator.length, secondInstance.location);

    return [value substringWithRange:finalRange];
}
Run Code Online (Sandbox Code Playgroud)

用法:

NSString *myName = [self getSubstring:@"This is my :name:, woo!!" betweenString:@":"];
Run Code Online (Sandbox Code Playgroud)

  • 问题是这两行代码只能解决任何人都不会存在的特定情况 - 甚至可能不是那个问过它的人. (2认同)

Abh*_*hra 13

也可以使用它

NSString *ChkStr = [MyString substringWithRange:NSMakeRange(5, 26)];
Run Code Online (Sandbox Code Playgroud)

注意 - 你的NSMakeRange(start, end)应该是NSMakeRange(start, end- start);


Jef*_*Neo 12

这是@Regexident选项1和@Garett答案的一个小组合,在前缀和后缀之间获得一个强大的字符串切割器,上面有更多... ANDMORE字样.

NSString *haystack = @"MOREvalue:hello World:valueANDMORE";
NSString *prefix = @"value:";
NSString *suffix = @":value";
NSRange prefixRange = [haystack rangeOfString:prefix];
NSRange suffixRange = [[haystack substringFromIndex:prefixRange.location+prefixRange.length] rangeOfString:suffix];
NSRange needleRange = NSMakeRange(prefixRange.location+prefix.length, suffixRange.location);
NSString *needle = [haystack substringWithRange:needleRange];
NSLog(@"needle: %@", needle);
Run Code Online (Sandbox Code Playgroud)