2011-07-26 18 views
32

tengo una cadena como se muestra a continuación,Objetivo C: ¿Cómo extraer parte de una cadena (por ejemplo, comenzar con '#')

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

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

Nota: Cuestión fue editado para mayor claridad

+0

¿Cómo se sabe dónde terminan las subcadenas? – zneak

+0

Según la pregunta, creo que quiere decir todo hasta un espacio. – Brain2000

Respuesta

56

Esto se puede hacer utilizando un NSScanner dividir la cuerda hacia arriba. 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]; 

Aquí es cómo funciona el código:

  1. escanear 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 guardados 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 substring a la matriz substrings.
  6. GOTO 1
+1

¡Muchas gracias! me salvó esta noche! – trillions

32
[aString substringWithRange:NSMakeRange(13, 10)] 

le daría substring1

Se puede calcular el rango usando:

NSRange startRange = [aString rangeOfString:@"#"]; 
NSRange endRange = [original rangeOfString:@"1"]; 

NSRange searchRange = NSMakeRange(startRange.location , endRange.location); 
[aString substringWithRange:searchRange] 

le daría substring1

Leer más : Position of a character in a NSString or NSMutableString

y

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

+1

substring1 fue solo un ejemplo. La codificación difícil para buscar "1" es simplemente malo. Esta no es una solución correcta si no sabes qué es la cadena después de #. Además, esto no responde a la pregunta OP para buscar cada aparición de cadena después de #. ¿Qué pasa con substring2? –

5

Asumiendo que usted está buscando para encontrar 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 sintaxis o longitud fuera por alguna parte 1:

-(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 @""; 
    } 
} 
+0

+1 @ Brain2000, gracias por su respuesta. Funcionó para mí –

11

Bastante simple, fácil de entender versión evitando NSRange cosas:

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

¡Gracias! ¡Esta es la mejor respuesta porque es la más simple y efectiva! – coolcool1994

+0

Me da una advertencia de comparación. Tuve que hacer una cadena para comparar = @ "#" y luego tuve que usar [palabra characterAtIndex: 0] == [compare characterAtIndex: 0]. – denikov

+0

Sí lo es, bastante simple +1 –

3

Otra solución simple:

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

un código general y simple para seleccionar todas las palabras comenzando con "#" en un NSString es:

NSString * aString = @"This is the #substring1 and #subString2 ..."; 
NSMutableArray *[email protected][].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. La línea condicional se utiliza en caso de que su elemento seleccionado es la última palabra

1

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

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

Espero que esto ayude.

Cuestiones relacionadas