And*_*ebe 1 regex cocoa-touch objective-c ios nsregularexpression
我试图解析.rtf由其他人创建的文件,我无法控制文件内容或格式.文件有几个块,每个块都有一组我需要获取的信息.每个块都设置如下:
[Title]
[Type] ([sub type])
Level: [CSV list of levels]
Components: [CSV list of components]
Time: [proprietary time format]
Length: [length value]
Target: [target text]
Dwell: [dwell time in proprietary time format]
Saves: [yes/no]
Additional Information: [additional information]
[notes]
Run Code Online (Sandbox Code Playgroud)
每个文件中可能有50到100个块,如上面的块.我已经使用NSRegularExpression该类在我的应用程序中进行了一些其他解析,但我甚至无法考虑如何实现此目的.
据我所知,每个块由双线分隔.
尝试使用a NSScanner,像这样:
NSString *input =
@"[Title]\n"
@"[Type] ([sub type])\n"
@"Level: [CSV list of levels]\n"
@"Components: [CSV list of components]\n"
@"Time: [proprietary time format]\n"
@"Length: [length value]\n"
@"Target: [target text]\n"
@"Dwell: [dwell time in proprietary time format]\n"
@"Saves: [yes/no]\n"
@"Additional Information: [additional information]\n"
@"[notes]\n";
NSString *title, *type, *subType, *level, *components, *time, *length, *target, *dwell, *saves, *additional, *notes;
title = type = subType = level = components = time = length = target = dwell = saves = additional = notes = nil;
NSScanner *scanner = [NSScanner scannerWithString:input];
// read the first line into title...
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&title];
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil];
// read the first part of the second line into type
[scanner scanUpToString:@" (" intoString:&type];
[scanner scanString:@"(" intoString:nil];
// read the next part of the second line into subType
[scanner scanUpToString:@")" intoString:&subType];
// read the end of the line
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil];
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil];
// read in level
[scanner scanString:@"Level: " intoString:nil];
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&level];
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil];
// read in components:
[scanner scanString:@"Components: " intoString:nil];
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&components];
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil];
// read in time:
[scanner scanString:@"Time: " intoString:nil];
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&time];
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil];
// read in length
[scanner scanString:@"Length: " intoString:nil];
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&length];
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil];
// complete for all other metadata
NSLog(@"%@", title);
NSLog(@"%@ (%@)", type, subType);
NSLog(@"%@", level);
NSLog(@"%@", components);
NSLog(@"%@", time);
NSLog(@"%@", length);
NSLog(@"%@", target);
NSLog(@"%@", dwell);
NSLog(@"%@", saves);
NSLog(@"%@", additional);
NSLog(@"%@", notes);
Run Code Online (Sandbox Code Playgroud)
这对我有用,显然完成了所有其他领域的过程.