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

Ios 如何正确地从字符串中取出字符串?,ios,nsstring,nsarray,nsrange,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

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

我做错了什么?

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

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

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

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

下面的方法应该有效。我不得不使用类似的语法来解析屏幕抓取的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];

下面的方法应该有效。我不得不使用类似的语法来解析屏幕抓取的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];

只是一种基于正则表达式(也称为regex)的替代方法,可以直接获取范围,而无需自己计算:

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

NSRange rRange = [sStr rangeOfString: pattern options: NSRegularExpressionSearch];
。。。后面直接跟任何东西(用点表示)零次或多次(星号)。问号意味着它应该使比赛尽可能小。在这种情况下,如果字符串中有两个YYY(在下面的示例中),它将选择第一个。因为字符串中没有这个问题,所以实际上并不需要它,但它使模式更加健壮,以防将来发生变化

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

不需要将模式保存在自己的变量中,这只是为了可读性。如果您更喜欢一行,您可以将其全部粘贴在一行上


例如,网上有很多教程。

只是一个基于正则表达式(又称正则表达式)的替代方法,可以直接获取范围,而无需自己计算:

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

NSRange rRange = [sStr rangeOfString: pattern options: NSRegularExpressionSearch];
。。。后面直接跟任何东西(用点表示)零次或多次(星号)。问号意味着它应该使比赛尽可能小。在这种情况下,如果字符串中有两个YYY(在下面的示例中),它将选择第一个。因为字符串中没有这个问题,所以实际上并不需要它,但它使模式更加健壮,以防将来发生变化

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

不需要将模式保存在自己的变量中,这只是为了可读性。如果您更喜欢一行,您可以将其全部粘贴在一行上


例如,网上有许多教程。

如果您试图获取AssetGroup的名称。难道没有更简单的方法吗。类似于
NSString*name=[group valueForProperty:AlassetGroupPropertyName]。这将为您提供assetGroup的(组)名称。此处
alassetgroup*group=assetGroups[indexPath.row]它被称为“substring”。如果您试图获取assetGroups名称,则Monolo将其用于tebleview,以便indexath.row为正确的单元格使用正确的字符串。难道没有更简单的方法吗。类似于
NSString*name=[group valueForProperty:AlassetGroupPropertyName]。这将为您提供assetGroup的(组)名称。此处
alassetgroup*group=assetGroups[indexPath.row]它被称为“子字符串”。Monolo表示tebleview,因此indexPath.row为正确的单元格使用正确的字符串。这是如何工作的?它叫什么:P我喜欢学习新事物:这是如何工作的?它叫什么?我喜欢学习新东西