2011-04-15 17 views
71

Si quiero obtener un valor de NSString @"value:hello World:value", ¿qué debo usar?¿Cómo obtener la subcadena de NSString?

El valor de retorno que deseo es @"hello World".

+0

posible duplicar [buscar dentro de NSstring] (http://stackoverflow.com/questions/3771211/search-within-nsstring) o [Buscar a través de NSString utilizando Expresión regular.] (Http://stackoverflow.com/questions/ 4353834/search-through-nsstring-using-regular-expression) –

+0

Estoy votando para cerrar esta pregunta porque no está claro lo que está preguntando. No hay ninguna indicación de exactamente qué se quiere aquí. ¿Quieres simplemente devolver '" hello World "'? 'return @" hello World "'. ¿Quieres devolver solo lo que hay entre dos puntos? ¿Quieres quitar todo lo que queda del colon izquierdo y todo lo correcto del colon derecho? No hay criterios de entrada/salida claramente definidos para esta pregunta (como vemos con la lista resultante de preguntas que todos resuelven el problema con una gran variedad de enfoques). – nhgrif

Respuesta

146

Opción 1:

NSString *haystack = @"value:hello World:value"; 
NSString *haystackPrefix = @"value:"; 
NSString *haystackSuffix = @":value"; 
NSRange needleRange = NSMakeRange(haystackPrefix.length, 
            haystack.length - haystackPrefix.length - haystackSuffix.length); 
NSString *needle = [haystack substringWithRange:needleRange]; 
NSLog(@"needle: %@", needle); // -> "hello World" 

Opción 2:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^value:(.+?):value$" options:0 error:nil]; 
NSTextCheckingResult *match = [regex firstMatchInString:haystack options:NSAnchoredSearch range:NSMakeRange(0, haystack.length)]; 
NSRange needleRange = [match rangeAtIndex: 1]; 
NSString *needle = [haystack substringWithRange:needleRange]; 

Éste podría ser un poco más de la parte superior para su caso bastante trivial sin embargo.

Opción 3:

NSString *needle = [haystack componentsSeparatedByString:@":"][1]; 

Ésta crea tres cadenas temporales y una gran variedad mientras realiza el cortado.


Todos los fragmentos asumen que lo que se busca en realidad está contenido en la cadena.

+0

Lloró en NSAnchoredSearch ... tal vez NSMatchingAnchored es mejor. – Jonny

61

Aquí es una respuesta un poco menos complicada:

NSString *myString = @"abcdefg"; 
NSString *mySmallerString = [myString substringToIndex:4]; 

Véase también substringWithRange y substringFromIndex

+1

Lo sentimos, esto no responde la pregunta (cómo obtener una subcadena desde el medio de una cadena). – Monolo

16

Aquí hay una función simple que le permite hacer lo que busca:

- (NSString *)getSubstring:(NSString *)value betweenString:(NSString *)separator 
{ 
    NSRange firstInstance = [value rangeOfString:separator]; 
    NSRange secondInstance = [[value substringFromIndex:firstInstance.location + firstInstance.length] rangeOfString:separator]; 
    NSRange finalRange = NSMakeRange(firstInstance.location + separator.length, secondInstance.location); 

    return [value substringWithRange:finalRange]; 
} 

Uso:

NSString *myName = [self getSubstring:@"This is my :name:, woo!!" betweenString:@":"]; 
+1

En caso de que sea esclarecedor, puedo decirle la razón por la que voté la otra respuesta. Prefiero escribir dos líneas de código que seis. –

+2

El problema es que esas dos líneas de código solo resuelven un caso específico que nunca existirá para nadie, probablemente ni siquiera para la persona que lo solicitó. – Garett

+0

'getSubstring: ...' debe llamarse 'substringInString: ...' ya que no le está pasando una subcadena y los métodos que comienzan con 'get ...' generalmente esperan pasar un puntero de buffer para escribir. 'substringFromIndex:' crea una subcadena intermedia, que no es necesaria, para eso 'rangeOfString: options: range:' es para. Por último, al envolver el fragmento inseguro en un método supuestamente genérico, está ocultando un error: si el separador existe una o más veces en la cadena, obtendrá una excepción fuera de rango. – Regexident

10

Aquí hay una pequeña combinación de @Regexident Opción 1 y respuestas @Garett, para obtener un poderoso cortador de cuerdas entre un prefijo y sufijo, con MÁS ... Y MÁS palabras en él.

NSString *haystack = @"MOREvalue:hello World:valueANDMORE"; 
NSString *prefix = @"value:"; 
NSString *suffix = @":value"; 
NSRange prefixRange = [haystack rangeOfString:prefix]; 
NSRange suffixRange = [[haystack substringFromIndex:prefixRange.location+prefixRange.length] rangeOfString:suffix]; 
NSRange needleRange = NSMakeRange(prefixRange.location+prefix.length, suffixRange.location); 
NSString *needle = [haystack substringWithRange:needleRange]; 
NSLog(@"needle: %@", needle); 
11

Uso esto también

NSString *ChkStr = [MyString substringWithRange:NSMakeRange(5, 26)]; 

Nota - Su NSMakeRange(start, end) debería ser NSMakeRange(start, end- start);

Cuestiones relacionadas