2011-04-15 68 views
71

如果我想从NSString @"value:hello World:value"得到一个值,我应该使用什么?如何获取NSString的子串?

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

+0

可能重复[在NSstring中搜索](http://stackoverflow.com/questions/3771211/search-within-nsstring)或[使用正则表达式搜索NSString。](http://stackoverflow.com/questions/ 4353834 /搜索通过nsstring使用正则表达式) – 2011-04-15 11:48:33

+0

我投票结束这个问题不清楚你问什么。根本没有任何迹象显示这里到底需要什么。你想只返回'“你好世界”'? 'return @“hello World”'。你想回归冒号之间的内容吗?你想剥离最左边结肠的所有东西,以及右边结肠的所有东西吗?对于这个问题没有明确定义的投入产出标准(正如我们所看到的问题清单,所有问题都可以通过各种方法解决问题)。 – nhgrif 2015-08-25 12:55:05

回答

146

选项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" 

选项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]; 

这一条可能有点过顶你相当琐碎的情况下,虽然。

选项3:

NSString *needle = [haystack componentsSeparatedByString:@":"][1]; 

这一个创建三个临时字符串和而分裂的阵列。


所有代码段都假定搜索到的内容实际上包含在字符串中。

+0

它在NSAnchoredSearch上哭了...也许NSMatchingAnchored更好。 – Jonny 2017-01-05 09:52:11

61

这里有一个稍微不那么复杂的答案:

NSString *myString = @"abcdefg"; 
NSString *mySmallerString = [myString substringToIndex:4]; 

参见substringWithRange和substringFromIndex

+1

对不起,这不回答这个问题(如何从字符串中获取子字符串)。 – Monolo 2013-04-27 15:42:45

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]; 
} 

用法:

NSString *myName = [self getSubstring:@"This is my :name:, woo!!" betweenString:@":"]; 
+1

如果照亮的话,我可以告诉你我投其他答案的理由。我宁愿写两行代码,而不是六行。 – 2013-11-15 17:01:05

+2

问题是,这两行代码只能解决任何人都不会存在的特定情况 - 甚至可能对于提问者也不存在。 – Garett 2013-11-19 22:39:52

+0

'getSubstring:...'应该被称为'substringInString:...',因为你没有向它传递一个子字符串,而且以'get ...'开头的方法通常需要传递一个缓冲区指针来写入。 'substringFromIndex:'创建一个中间子字符串,这是不必要的,这就是'rangeOfString:options:range:'的用途。最后,通过将不安全的代码片段包装在一个所谓的泛型方法中,您可以屏蔽一个错误:如果分隔符在字符串中存在一次或更少次,则会出现超出范围的异常。 – Regexident 2014-05-07 15:57:00

10

这里有@Regexident Option 1和@Garett答案的一个小组合,在前缀和后缀之间得到一个强大的字符串切割器,其上有MORE ... 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); 
11

使用,这也

NSString *ChkStr = [MyString substringWithRange:NSMakeRange(5, 26)]; 

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