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:
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Í. substring
a la matriz de substrings
. [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