2013-05-10 40 views
0

我有一個NSString,看起來像這樣"ALAssetsGroup - Name:Hej - ProgCam, Type:Album, Assets count:0"我想「提取」名稱「Hej」。我試圖做這樣的:如何正確地從字符串中取出一個字符串?

NSString *sStr = [NSString stringWithFormat:@"%@", assetGroups[indexPath.row]]; 
NSRange range1 = [sStr rangeOfString:@"Name: "]; 
NSRange range2 = [sStr rangeOfString:@" - ProgCam"]; 
NSRange rRange = {range1.location + range1.length, range2.location}; 
NSString *rStr = [sStr substringWithRange:rRange]; 
cell.cellLabel.text = [NSString stringWithFormat:@"%@", rStr]; 

,但我得到這個錯誤:

*** Terminating app due to uncaught exception 'NSRangeException', reason: 
'-[__NSCFString substringWithRange:]: Range or index out of bounds' 

什麼我錯在這裏做什麼?

+0

如果您嘗試獲取assetGroups名稱。沒有一種更簡單的方法。比如'NSString * name = [group valueForProperty:ALAssetsGroupPropertyName];'。這會給你assetGroup的(組)名稱。這裏'ALAssetsGroup * group = assetGroups [indexPath.row];' – croyneaus4u 2013-05-10 13:28:36

+0

它被稱爲「子串」。 – Sulthan 2013-05-10 13:29:54

+0

Monolo它的一個tebleview,所以indexPath.row爲右邊的單元格輸入正確的字符串。 – Arbitur 2013-05-10 16:41:35

回答

1

下面應該工作。我不得不使用類似的語言來解析屏幕截圖。在NSString中尋找基於搜索字符的文本應該在下面得到滿足。首先放置起始字符串,然後將索引0處的componentsSeparatedByString作爲終止符。

*注意 - 這將返回第一個實例。如果有其他情況下,他們會在NSString的

NSString *sStr = [NSString stringWithFormat:@"%@", assetGroups[indexPath.row]]; 
NSString *name= [[[[sStr componentsSeparatedByString:@"Name:"] objectAtIndex:1] componentsSeparatedByString:@" - ProgCam"] objectAtIndex:0]; 
cell.cellLabel.text = [NSString stringWithFormat:@"%@", name]; 
3

你必須從range2.location減去range1.location + range1.length:

NSInteger start = range1.location + range1.length; 
NSRange rRange = {start, range2.location - start}; 
2

只是一個基於正則表達式(也稱爲正則表達式)替代,以獲得範圍被忽略,直接,而無需自己進行計算:

// A regex pattern to match everything between "Name:" and " - ProgCam" 
NSString *pattern = @"(?<=Name:).*?(?= - ProgCam)"; 

NSRange rRange = [sStr rangeOfString: pattern options: NSRegularExpressionSearch]; 

解剖正則表達式:

(?<=XXX) 

開始XXX(你的情況是這樣的 「名稱:」 部分)。這是與XXX匹配的積極lookbehind。這意味着XXX必須在那裏,但它不會被視爲匹配字符串的一部分。

.*? 

...後面直接跟着任何東西(用點表示)零次或多次(星號)。問號意味着它應該儘可能小。在這種情況下,如果字符串中有兩個YYY(在下面的例子中),它會選擇第一個。由於你的字符串中沒有這個問題,所以你並不需要它,但它會使模式更加強大,以防萬一事情在未來發生變化。

(?=YYY) 

...直到YYY(在你的情況下,這是「 - ProgCam」部分)。這是與YYY匹配的正面預測。這意味着YYY必須在那裏,但它不會被視爲匹配字符串的一部分。

沒有特別需要將模式保留在自己的變量中,這只是爲了可讀性。如果你喜歡用線,你可以把它全部放在一條線上。

網上有很多教程,例如this one

+0

這是如何工作的?它叫什麼:P 我喜歡學習新東西:D – Arbitur 2013-05-10 16:31:30

相關問題