stringparsing,用逗号分开,除非用撇号括起来

我需要parsingObjective-C for iOS应用程序中的以下string

NSString * htmlString = @“12,22,'stringA','','stringB,stringC',2,'stringD'”;

我想要一个这样的数组

{ @12, @22, @"stringA", @"emptySlotInfo", @"stringB, stringC", @2, @"stringD" } 

头痛的是@“strictb,stringC”,因为

 [htmlString componentsSeparatedByString:@","]; 

对于这种情况不起作用,@“'”作为分隔符也不起作用。

我如何获得必要的组件?

你可以使用NSScanner 。

如果它扫描一个' ,它知道一个string正在开始和忽略,直到它读取下一个' 。 如果没有开放' ,请阅读。

这cocoawithlove文章可能会有所帮助。


我做了一个快速原型。 最有可能有很多优化,因为我也不是NSScanner的专家

 NSString *htmlString = @"12, 22, 'stringA','', 'stringB, stringC', 2,'stringD'"; NSScanner *scanner = [NSScanner scannerWithString:htmlString]; NSString *apostrophe = @"'"; // scanner needs to detect this NSString *comma = @","; // scanner needs to detect this NSCharacterSet *charSet = [NSCharacterSet characterSetWithCharactersInString:[NSString stringWithFormat:@"%@%@", apostrophe, comma]]; BOOL apostropheOpen = NO; // is the scan location inside a single quoted substring? NSInteger lastCommaIndex = -1; // track last found comma's index NSMutableArray *array = [NSMutableArray array]; while (![scanner isAtEnd]) { [scanner scanUpToCharactersFromSet:charSet intoString:NULL]; NSString *charAtlocation = [htmlString substringWithRange:NSMakeRange([scanner scanLocation], 1)]; if ([charAtlocation isEqualToString:apostrophe]){ apostropheOpen = !apostropheOpen; } else if ([charAtlocation isEqualToString:comma]){ if (!apostropheOpen) { [array addObject: [scanner.string substringWithRange:NSMakeRange(lastCommaIndex+1, [scanner scanLocation]- lastCommaIndex-1)]]; lastCommaIndex = [scanner scanLocation]; } } [scanner setScanLocation:[scanner scanLocation]+1]; } ; // scanner only dealt with the string until the last comma, probably one more value to handle if (lastCommaIndex < [scanner scanLocation]){ [array addObject: [scanner.string substringWithRange:NSMakeRange(lastCommaIndex+1, [scanner scanLocation]- lastCommaIndex-1)]]; } // array contains seperated strings, but with blanks and apostrophes // we will deal with them now __block NSMutableArray *resultArray = [NSMutableArray array]; [array enumerateObjectsUsingBlock:^(NSString *obj, NSUInteger idx, BOOL *stop) { obj = [[obj stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] stringByTrimmingCharactersInSet:charSet]; if ([obj length] > 0) [resultArray addObject:obj]; else [resultArray addObject:@"emptySlotInfo"]; }]; 

resultArray包含

 ( 12, 22, stringA, emptySlotInfo, stringB, stringC, 2, stringD )