2013-05-10 92 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

相关问题