Objetivo C: Cómo extraer parte de una cadena (por ejemplo, comenzar con ‘#’)

Tengo una cadena como se muestra a continuación,

NSString * aString = @"This is the #substring1 and #subString2 I want"; 

¿Cómo puedo seleccionar solo el texto que comienza con ‘#’ (y termina con un espacio), en este caso ‘subString1’ y ‘subString2’?

Nota: la pregunta fue editada para mayor claridad

Puede hacer esto usando un NSScanner para dividir la cadena. Este código recorrerá una cadena y rellenará una matriz con subcadenas.

 NSString * aString = @"This is the #substring1 and #subString2 I want"; NSMutableArray *substrings = [NSMutableArray new]; NSScanner *scanner = [NSScanner scannerWithString:aString]; [scanner scanUpToString:@"#" intoString:nil]; // Scan all characters before # while(![scanner isAtEnd]) { NSString *substring = nil; [scanner scanString:@"#" intoString:nil]; // Scan the # character if([scanner scanUpToString:@" " intoString:&substring]) { // If the space immediately followed the #, this will be skipped [substrings addObject:substring]; } [scanner scanUpToString:@"#" intoString:nil]; // Scan all characters before next # } // do something with substrings [substrings release]; 

Así es como funciona el código:

  1. Escanea hasta un #. Si no se encuentra, el escáner estará al final de la cadena.
  2. Si el escáner está al final de la cadena, hemos terminado.
  3. Escanee el carácter # para que no esté en la salida.
  4. Escanee hasta un espacio, con los caracteres que se escanean almacenados en substring . Si el # fue el último carácter, o fue seguido inmediatamente por un espacio, el método devolverá NO. De lo contrario, devolverá SÍ.
  5. Si se escanearon los caracteres (el método devolvió SÍ), agregue la substring a la matriz de substrings .
  6. GOTO 1
 [aString substringWithRange:NSMakeRange(13, 10)] 

te daría subcadena1

Puedes calcular el rango usando:

 NSRange startRange = [aString rangeOfString:@"#"]; NSRange endRange = [original rangeOfString:@"1"]; NSRange searchRange = NSMakeRange(startRange.location , endRange.location); [aString substringWithRange:searchRange] 

te daría subcadena1

Leer más: posición de un personaje en un NSString o NSMutableString

y

http://iosdevelopertips.com/cocoa/nsrange-and-nsstring-objects.html

Versión bastante simple y fácil de entender que evita NSRange cosas de NSRange :

 NSArray * words = [string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; NSMutableArray * mutableWords = [NSMutableArray new]; for (NSString * word in words){ if ([word length] > 1 && [word characterAtIndex:0] == '#'){ NSString * editedWord = [word substringFromIndex:1]; [mutableWords addObject:editedWord]; } } 

Suponiendo que busca la primera cadena que comienza con una libra y termina con un espacio, esto podría funcionar. No tengo XCode delante de mí, así que perdónenme si hay un error de syntax o una longitud de 1 en alguna parte:

 -(NSString *)StartsWithPound:(NSString *)str { NSRange range = [str rangeOfString:@"#"]; if(range.length) { NSRange rangeend = [str rangeOfString:@" " options:NSLiteralSearch range:NSMakeRange(range.location,[str length] - range.location - 1)]; if(rangeend.length) { return [str substringWithRange:NSMakeRange(range.location,rangeend.location - range.location)]; } else { return [str substringFromIndex:range.location]; } } else { return @""; } } 

Otra solución simple:

 NSRange hashtag = [aString rangeOfString:@"#"]; NSRange word = [[aString substringFromIndex:hashtag.location] rangeOfString@" "]; NSString *hashtagWord = [aString substringWithRange:NSMakeRange(hashtag.location, word.location)]; 

Esto es lo que haría:

 NSString *givenStringWithWhatYouNeed = @"What you want to look through"; NSArray *listOfWords = [givenStringWithWhatYouNeed componentsSeparatedByString:@" "]; for (NSString *word in listOfWords) { if ([[word substringWithRange:NSMakeRange(0, 1)]isEqualToString:@"#"]) { NSString *whatYouWant = [[word componentsSeparatedByString:@"#"]lastObject]; } } 

Luego puede hacer lo que necesita con las instancias whatYouWant . Si desea saber qué cadena es (si es la subcadena 1 o 2), verifique el índice de la cadena de word en la matriz listOfWords .

Espero que esto ayude.

Un código general y simple para seleccionar todas las palabras que comienzan con “#” en un NSString es:

 NSString * aString = @"This is the #substring1 and #subString2 ..."; NSMutableArray *selection=@[].mutableCopy; while ([aString rangeOfString:@"#"].location != NSNotFound) { aString = [aString substringFromIndex:[aString rangeOfString:@"#"].location +1]; NSString *item=([aString rangeOfString:@" "].location != NSNotFound)?[aString substringToIndex:[aString rangeOfString:@" "].location]:aString; [selection addObject:item]; } 

si aún necesita la secuencia original, puede hacer una copia. El condicional en línea se usa en caso de que el artículo seleccionado sea la última palabra