Objective-C - 使用字符串,使用NSRange查找子字符串

时间:2013-08-26 07:32:20

标签: objective-c string nsstring nsrange

我正在处理字符串,我有一个小问题,我不理解。事实上,我有一个这样的字符串:"ALAsset - Type:Photo, URLs:assets-library://asset/asset.JPG?id=168BA548-9C81-4B08-B69C-B775E5DD9341&ext=JPG"我需要找到"URLs:" and "?id="之间的字符串。为此,我正在尝试使用NSRange创建一个新字符串。在这种模式下,我给出了我需要的第一个索引和最后一个索引,但它似乎不起作用。 这里有我的代码:

NSString *description = [asset description];
NSRange first = [description rangeOfString:@"URLs:"];
NSRange second = [description rangeOfString:@"?id="];
NSString *path = [description substringWithRange: NSMakeRange(first.location, second.location)];

它返回给我这种字符串:"URLs:assets-library://asset/asset.JPG?id=168BA548-9C81-4B08-B69C-B775E5DD9341&ext=JPG"。这是对的吗?我期待获得"assets-library://asset/asset.JPG" string. 哪里我做错了?有一个更好的方法吗? 我已按照此网址寻求帮助:http://www.techotopia.com/index.php/Working_with_String_Objects_in_Objective-C

由于

3 个答案:

答案 0 :(得分:3)

尝试此范围: NSMakeRange(first.location + first.length, second.location - (first.location + first.length))

答案 1 :(得分:2)

不要解析ALAsset描述字符串!如果描述改变了您的代码中断。使用方法ALAssetNSURL为您提供。首先,通过valueForProperty:方法获取URL字典(按资产类型映射)。然后,对于每个URL,获取absoluteString并从中删除查询字符串。通过在单视图iPhone应用程序模板的application:didFinishLaunchingWithOptions:方法中放置以下代码,我得到了您要查找的字符串。

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
   [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) {
       NSDictionary *URLDictionary = [asset valueForProperty:ALAssetPropertyURLs];
       for (NSURL *URL in [URLDictionary allValues]) {
           NSString *URLString = [URL absoluteString];
           NSString *query = [URL query];
           if ([query length] > 0) {
               NSString *toRemove = [NSString stringWithFormat:@"?%@",query];
               URLString = [URLString stringByReplacingOccurrencesOfString:toRemove withString:@""];
               NSLog(@"URLString = %@", URLString);
           }
       }
   }];
} failureBlock:^(NSError *error) {

}];

答案 2 :(得分:1)

NSRange first = [description rangeOfString:@"URLs:"];

为您提供U的位置,因此您需要first.location+5获取assets-library的起始位置。

NSRangeMake(loc,len)需要一个起始位置loc和一个长度,因此您需要使用second.location-first.location-5来获取所需的长度。

全部添加,将最后一行替换为:

NSRange r = NSMakeRange(first.location+5, second.location-first.location-5);
NSString *path = [description substringWithRange:r];