Si quiero obtener un valor de NSString @"value:hello World:value"
, ¿qué debo usar?
El valor de retorno que quiero es @"hello World"
.
objective-c
cocoa-touch
nsstring
Csabi
fuente
fuente
"hello World"
?return @"hello World"
. ¿Quiere devolver lo que está entre dos puntos? ¿Quiere quitar todo lo que queda del colon más a la izquierda y todo lo que queda a la derecha del colon más a la derecha? No hay criterios de entrada-salida claramente definidos para esta pregunta (como vemos con la lista resultante de preguntas que resuelven el problema con una gran variedad de enfoques).Respuestas:
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"
Opcion 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];
Sin embargo, este podría ser un poco exagerado para su caso bastante trivial.
Opcion 3:
NSString *needle = [haystack componentsSeparatedByString:@":"][1];
Este crea tres cadenas temporales y una matriz mientras se divide.
Todos los fragmentos asumen que lo que se busca está contenido en la cadena.
fuente
Aquí hay una respuesta un poco menos complicada:
NSString *myString = @"abcdefg"; NSString *mySmallerString = [myString substringToIndex:4];
Véase también substringWithRange y substringFromIndex
fuente
Aquí hay una función simple que le permite hacer lo que está buscando:
- (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:@":"];
fuente
getSubstring:…
debe llamarsesubstringInString:…
ya que no le está pasando una subcadena y, porget…
lo general, se espera que los métodos que comienzan con pasen un puntero de búfer para escribir.substringFromIndex:
crea una subcadena intermedia, que es innecesaria, para esorangeOfString:options:range:
es. Por último, al envolver el fragmento inseguro en un método supuestamente genérico, está enmascarando un error: si el separador existe una o menos veces en la cadena, obtendrá una excepción fuera de rango.Usa esto también
NSString *ChkStr = [MyString substringWithRange:NSMakeRange(5, 26)];
Nota:
NSMakeRange(start, end)
debe serNSMakeRange(start, end- start)
;fuente
Aquí hay una pequeña combinación de @Regexident Option 1 y @Garett responde, para obtener un poderoso cortador de cuerdas entre un prefijo y un 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);
fuente
<i></i>
etiqueta en mi proyecto para poner esas cadenas en cursiva. :)