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

Tengo una cadena como se muestra abajo,

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: la Pregunta fue editado para mayor claridad

  • Cómo se sabe que las subcadenas en la final?
  • De acuerdo a la pregunta, creo que se refiere a todo lo que hasta un espacio.
InformationsquelleAutor Zhen | 2011-07-26

7 Kommentare

  1. 56

    Usted puede hacer esto mediante una NSScanner para dividir la cadena de seguridad. Este código creará un bucle a través de una cadena y rellenar una matriz con las 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 será al final de la cadena.
    2. Si el escáner está en el extremo de la cadena, hemos terminado.
    3. Escanear el carácter # para que no lo está en el de salida.
    4. Escanear hasta un espacio, con los personajes que son escaneados almacenados en substring. Si el # fue el último carácter, o fue inmediatamente seguido por un espacio, el método devolverá NINGUNA. De lo contrario, se volverá SÍ.
    5. Si los caracteres fueron escaneados (el método devuelve YES), agregar substring a la substrings matriz.
    6. GOTO 1
    • Muchas gracias! me salvó esta noche!
  2. 33
    [aString substringWithRange:NSMakeRange(13, 10)] 

    a dar substring1

    Puede calcular el rango de uso:

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

    a dar substring1

    Leer más:
    La posición de un carácter en un NSString o NSMutableString

    y

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

    • substring1 fue sólo un ejemplo. La codificación duro para buscar el «1» es simplemente malo. Esto no es una solución adecuada si usted no sabe lo que la cadena es después de #. También esto no contesta OP cuestión de buscar para cada ocurrencia de la cadena después de #. ¿Qué acerca de substring2?
  3. 11

    Bastante sencillos, fáciles de entender versión evitar 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];
        }
    }
    • Gracias! Esta es la mejor respuesta, porque es la más simple y eficaz!
    • Me da una comparación de advertencia. Había que hacer una comparación de [email protected]»#» y, a continuación, tuvo que utilizar la [palabra characterAtIndex:0] == [comparar characterAtIndex:0].
    • Sí, sí que lo es,Bastante simple +1
  4. 5

    Suponiendo que usted está buscando para encontrar la primera cadena que se inicia con una libra, y termina con un espacio, esto podría funcionar. No tengo el XCode en frente de mí, así que me perdone si hay un error de sintaxis o la longitud de descuento por 1 en algún lugar:

    -(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 @"";
        }
    }
    • +1 @Brain2000, gracias por tu respuesta. A mí me funcionó.
  5. 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)];
  6. 1

    Esto es lo que me gustaría hacer:

    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 usted necesita con el whatYouWant instancias. Si quieres saber a qué cadena es (si es la subcadena 1 o 2), busque en el índice de de word cadena en el listOfWords matriz.

    Espero que esto ayude.

  7. 0

    General y simple código para seleccionar todas las palabras que comienzan con «#» en un NSString es:

    NSString * aString = @"This is the #substring1 and #subString2 ...";
    NSMutableArray *selection[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 usted todavía necesita la cadena original que usted puede hacer una copia.
    La línea de la condicional se utiliza en caso de que el elemento seleccionado es la última palabra

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea