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'

我在这里做错了什么?

4

3 回答 3

3

您必须从 range2.location 中减去 range1.location + range1.length:

NSInteger start = range1.location + range1.length;
NSRange rRange = {start, range2.location - start};
于 2013-05-10T13:11:15.590 回答
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,则可以将它们全部粘贴在一条线上。

网上有很多教程,比如这个

于 2013-05-10T15:53:30.693 回答
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];
于 2013-05-10T13:16:33.657 回答