按实例数解析NSMutableString

时间:2015-02-12 16:17:56

标签: objective-c nsmutablestring

我有一个包含大量数据的NSMutableString。一个简短的例子是:

  

MP3:姓名长度专辑

     

MP3:姓名长度专辑

     

MP3:姓名长度专辑

     

MP3:姓名长度专辑

现在,我想要完成的是解析字符串以仅包含前3个MP3数据集。所以,一旦第四个" MP3:"找到了,停止解析。

我已经尝试了多种方法来实现这一目标,但我已经盯着它看了太长时间并且开始变得愚蠢。如果它是一个数组,它会很简单但不幸的是它是一个字符串。有谁知道如何完成这背后的逻辑? 为了增加清晰度:我仍然希望首先出现MP3。它们每次都会不同,所以我不能做一个subStringToIndex。

3 个答案:

答案 0 :(得分:1)

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++;
    }
}

答案 1 :(得分:1)

NSString * stringToParse = @"MP3: hola MP3: pfff MP3: cosas MP3: hello";

NSArray * arrayStringParsed = [stringToParse componentsSeparatedByString:@"MP3:"];

结果是和数组:

&lt; __ NSArrayM 0x15fb2f80&gt;( ,  你好 ,  pfff,  cosas,  你好 )

第一个元素没有任何东西,只有其他4个被解析,你可以使用它们。

答案 2 :(得分:1)

为了有效地做到这一点,假设输入字符串非常长(在前三个之后包含数千行),则需要避免使用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);