如何通过字符串查找段落并在ios中替换其中的单词?

时间:2015-01-22 11:53:08

标签: ios objective-c

我有一个包含很少素材的.mtl文件。它就像是,

newmtl Bed_Sh
Ns 96.078431
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ni 1.000000
d 1.000000
illum 2
map_Kd 145349-red-fabric-with-floral-pattern-texture-free-high-resolution-photo.jpg

newmtl Bed_Wood
Ns 96.078431
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ni 1.000000
d 1.000000
illum 2
map_Kd wood-textures_00248249.jpg

我需要使用Bed_WoodBed_Sh标识段落并替换map_Kd (imageName.jpg)

我尝试使用以下代码。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

// getting path of the MTL file
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", @"test04", @"mtl"]];


NSString *content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];

NSError *error = nil;

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^map_Kd (.*)$" options:NSRegularExpressionAnchorsMatchLines error:&error];

NSString *editedContent = [regex stringByReplacingMatchesInString:content options:0 range:NSMakeRange(0, [content length]) withTemplate:@"abc.jpg"];

NSLog(@"%@", editedContent);

这将替换文件中的所有map_Kd。如何根据段落标题(Bed_Sh, Bed_Wood)来完成。

修改:: 我需要根据标题标识map_Kd Bed_ShBed_Wood

提前致谢!

2 个答案:

答案 0 :(得分:0)

你可以自己制作NSArray块。你只需要分割整个字符串,例如与

NSArray *chunks = [inputString componentsSeparatedByString:@"\n"];

这假设每个块之间总是有一个空的换行符。另一个分隔符是newmtl,但要小心,因为删除了用于进行拆分的字符串。也就是说,您必须将newmtl重新附加到每个块的开头。

将其拆分为块后,在数组中搜索您的密钥,并在替换后将数组重新组合为单个字符串。

答案 1 :(得分:0)

试试这个:

if ([fileContentString rangeOfString:@"Bed_Wood"].location != NSNotFound &&
[fileContentString rangeOfString:@"Bed_Sh"].location != NSNotFound) {
   NSString *editedContent = [fileContentString stringByReplacingMatchesInString:content options:0 range:NSMakeRange(0, [content length]) withTemplate:@"abc.jpg"];
}

或内部如果

[fileContentString stringByReplacingOccurrencesOfString:@"string to replace"
                                 withString:@"replacement"];