按实例数解析 NSMutableString
Parsing NSMutableString By Number Of Instances
我有一个包含大量数据的 NSMutableString。一个简短的例子是:
MP3: name length album
MP3: name length album
MP3: name length album
MP3: name length album
现在,我要完成的是解析字符串以仅包含前 3 个 MP3 数据集。因此,一旦找到“MP3:”的第四个实例,就停止解析。
我已经尝试了很多方法来完成这个,但我盯着它看的时间太长了,开始变得愚蠢了。如果它是一个数组,它会很简单,但不幸的是它是一个字符串。有谁知道如何实现这背后的逻辑?
为了更加清晰:我仍然希望出现第一个 MP3。它们每次都会不同,所以我不能做 subStringToIndex。
NSArray *lines = [data componentsSeparatedByString:@"\n"];
for (NSUInteger i = 0, count = 0; i < lines.count && count < 3; i++) {
NSString *line = lines[i];
NSRange range = [line rangeOfString:@"MP3:"];
if (range.location == 0 && range.length == @"MP3:".length) {
// parsing
count++;
}
}
NSString * stringToParse = @"MP3: hola MP3: pfff MP3: cosas MP3: hello";
NSArray * arrayStringParsed = [stringToParse componentsSeparatedByString:@"MP3:"];
结果是数组:
<__NSArrayM 0x15fb2f80>(
,
你好 ,
噗噗
cosas ,
你好
)
第一个元素没有任何内容,但其他 4 个已被解析,您可以使用它们。
要有效地执行此操作,假设输入字符串很长(前三行之后包含数千行),您需要避免使用 componentsSeparatedByString:
。
相反,通过重复使用 rangeOfString:
找到字符串中的前三个换行符。
NSString *input = @"MP3: line1\nMP3: line2\nMP3: line3\nMP3: line4\nMP3: line5\n";
NSUInteger lineStartLocation = 0;
NSUInteger inputLength = input.length;
for (int i = 0; i < 3; ++i) {
NSRange searchRange = NSMakeRange(lineStartLocation, inputLength - lineStartLocation);
NSRange newlineRange = [input rangeOfString:@"\n" options:0 range:searchRange];
if (newlineRange.location == NSNotFound) {
// Not enough lines in input!
break;
} else {
lineStartLocation = newlineRange.location + 1;
}
}
NSString *top3 = [input substringToIndex:lineStartLocation];
NSLog(@"top3 = %@", top3);
我有一个包含大量数据的 NSMutableString。一个简短的例子是:
MP3: name length album
MP3: name length album
MP3: name length album
MP3: name length album
现在,我要完成的是解析字符串以仅包含前 3 个 MP3 数据集。因此,一旦找到“MP3:”的第四个实例,就停止解析。
我已经尝试了很多方法来完成这个,但我盯着它看的时间太长了,开始变得愚蠢了。如果它是一个数组,它会很简单,但不幸的是它是一个字符串。有谁知道如何实现这背后的逻辑? 为了更加清晰:我仍然希望出现第一个 MP3。它们每次都会不同,所以我不能做 subStringToIndex。
NSArray *lines = [data componentsSeparatedByString:@"\n"];
for (NSUInteger i = 0, count = 0; i < lines.count && count < 3; i++) {
NSString *line = lines[i];
NSRange range = [line rangeOfString:@"MP3:"];
if (range.location == 0 && range.length == @"MP3:".length) {
// parsing
count++;
}
}
NSString * stringToParse = @"MP3: hola MP3: pfff MP3: cosas MP3: hello";
NSArray * arrayStringParsed = [stringToParse componentsSeparatedByString:@"MP3:"];
结果是数组:
<__NSArrayM 0x15fb2f80>( , 你好 , 噗噗 cosas , 你好 )
第一个元素没有任何内容,但其他 4 个已被解析,您可以使用它们。
要有效地执行此操作,假设输入字符串很长(前三行之后包含数千行),您需要避免使用 componentsSeparatedByString:
。
相反,通过重复使用 rangeOfString:
找到字符串中的前三个换行符。
NSString *input = @"MP3: line1\nMP3: line2\nMP3: line3\nMP3: line4\nMP3: line5\n";
NSUInteger lineStartLocation = 0;
NSUInteger inputLength = input.length;
for (int i = 0; i < 3; ++i) {
NSRange searchRange = NSMakeRange(lineStartLocation, inputLength - lineStartLocation);
NSRange newlineRange = [input rangeOfString:@"\n" options:0 range:searchRange];
if (newlineRange.location == NSNotFound) {
// Not enough lines in input!
break;
} else {
lineStartLocation = newlineRange.location + 1;
}
}
NSString *top3 = [input substringToIndex:lineStartLocation];
NSLog(@"top3 = %@", top3);