如何从字符串中正确取出字符串?

时间:2013-05-10 13:08:27

标签: ios nsstring nsarray nsrange

我有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'

我在这里做错了什么?

3 个答案:

答案 0 :(得分:3)

您必须从range2.location:

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

答案 1 :(得分: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匹配的正向后视。这意味着XXX必须在那里,但它不会被视为匹配字符串的一部分。

.*?

...直接跟随任何东西(用点表示)零次或多次(星号)。问号意味着它应该使匹配尽可能小。在这种情况下,如果字符串中有两个YYY(在下面的示例中),它将选择第一个。由于你的字符串中没有这个问题,你实际上并不需要它,但是如果将来发生变化,它会使模式更加健壮。

(?=YYY)

......直至YYY(在您的情况下,这是“ - ProgCam”部分)。这是与YYY匹配的正向前瞻。这意味着YYY必须在那里,但它不会被视为匹配字符串的一部分。

没有特别需要将模式保留在自己的变量中,这只是为了提高可读性。如果您更喜欢oneliners,您可以将它们全部放在一条线上。

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

答案 2 :(得分:1)

下面应该有效。我不得不使用类似于解析HTML的屏幕抓取。在下面应该满足基于搜索字符在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];