2011-04-15 63 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);