Objetivo c Split String Issue

Estoy intentando dividir una cadena en una NSArray, sin embargo, estoy teniendo un problema al ignorar las cadenas que tienen marcas de voz.

Por ejemplo

NSString *example = @"100 200 300 \"TEST ITEM\" 500"; NSArray *array = [example componentsSeparatedByString:@" "]; 

Sin embargo, la matriz se crea obviamente como 100, 100, 300, "Prueba, ITEM", 500. ¿Es posible tratar cualquier cosa con "" como uno?

Gracias

Podría usar un analizador CSV bien conocido que se puede configurar para usar espacios como separadores, y tratará correctamente las comillas dobles. Eso supone que desea el manejo usual de CSV como escaping de comillas dobles dentro de cadenas de doble cita, etc.

De lo contrario, probablemente necesitará escribir la lógica de análisis usted mismo; eche un vistazo a NSScanner , que le permitiría leer un espacio o una comilla doble, ver lo que obtiene y luego leer el siguiente espacio / doble presupuesto, etc.

Ejemplo:

 @interface ItemParser : NSObject<CHCSVParserDelegate> - (NSArray *)itemsFromString:(NSString *)input; @end @implementation ItemParser { NSMutableArray *_results; } - (NSArray *)itemsFromString:(NSString *)input { _results = [NSMutableArray array]; NSStringEncoding encoding = [input fastestEncoding]; NSInputStream *stream = [NSInputStream inputStreamWithData:[input dataUsingEncoding:encoding]]; CHCSVParser *parser = [[CHCSVParser alloc] initWithInputStream:stream usedEncoding:&encoding delimiter:' ']; parser.delegate = self; [parser parse]; return _results; } - (void)parser:(CHCSVParser *)parser didReadField:(NSString *)field atIndex:(NSInteger)fieldIndex { [_results addObject:field]; } @end 

Lo usaría así:

 NSString *example = @"100 200 300 \"TEST ITEM\" 500"; ItemParser *parser = [[ItemParser alloc] init]; NSLog(@"%@", [parser itemsFromString:example]); 

Aquí hay una categoría NSString que usa un NSScanner para dividir una cadena en términos de búsqueda, respetando varios types de pares de citas: "" '' '' “”

Uso:

 NSArray *terms = [@"This is my \"search phrase\" I want to split" searchTerms]; // results in: ["This", "is", "my", "search phrase", "I", "want", "to", "split"] 

Código:

 @interface NSString (Search) - (NSArray *)searchTerms; @end @implementation NSString (Search) - (NSArray *)searchTerms { // Strip whitespace and setup scanner NSCharacterSet *whitespace = [NSCharacterSet whitespaceAndNewlineCharacterSet]; NSString *searchString = [self stringByTrimmingCharactersInSet:whitespace]; NSScanner *scanner = [NSScanner scannerWithString:searchString]; [scanner setCharactersToBeSkipped:nil]; // we'll handle whitespace ourselves // A few types of quote pairs to check NSDictionary *quotePairs = @{@"\"": @"\"", @"'": @"'", @"\u2018": @"\u2019", @"\u201C": @"\u201D"}; // Scan NSMutableArray *results = [[NSMutableArray alloc] init]; NSString *substring = nil; while (scanner.scanLocation < searchString.length) { // Check for quote at beginning of string unichar unicharacter = [self characterAtIndex:scanner.scanLocation]; NSString *startQuote = [NSString stringWithFormat:@"%C", unicharacter]; NSString *endQuote = [quotePairs objectForKey:startQuote]; if (endQuote != nil) { // if it's a valid start quote we'll have an end quote // Scan quoted phrase into substring (skipping start & end quotes) [scanner scanString:startQuote intoString:nil]; [scanner scanUpToString:endQuote intoString:&substring]; [scanner scanString:endQuote intoString:nil]; } else { // Single word that is non-quoted [scanner scanUpToCharactersFromSet:whitespace intoString:&substring]; } // Process and add the substring to results if (substring) { substring = [substring stringByTrimmingCharactersInSet:whitespace]; if (substring.length) [results addObject:substring]; } // Skip to next word [scanner scanCharactersFromSet:whitespace intoString:nil]; } // Return non-mutable array return results.copy; } @end