2012-06-15 10 views
6

Como sugiere el título, me gustaría obtener la última palabra de un NSString. pensé que utiliza este código:Obtener la última palabra de un NSString

NSArray *listItems = [someNSStringHere componentsSeparatedByString:@" "]; 
NSString *lastWordString = [NSString stringWithFormat:@"%@", listItems.lastObject]; 
anotherNSStringHere = lastWordString; 

Pero creo que la NSArray tomará un tiempo para cargar si es grande (y es grande), y no sería reconocer una palabra separados por una coma.

¡Gracias por tu ayuda!

Respuesta

27

Si quieres ser súper robusta:

__block NSString *lastWord = nil; 

[someNSStringHere enumerateSubstringsInRange:NSMakeRange(0, [someNSStringHere length]) options:NSStringEnumerationByWords | NSStringEnumerationReverse usingBlock:^(NSString *substring, NSRange subrange, NSRange enclosingRange, BOOL *stop) { 
    lastWord = substring; 
    *stop = YES; 
}]; 

(Esto también se debe trabajar con idiomas no latinos; IOS 4 +/OS X 10.6+.)

Explicación básica:

-enumerateSubstringsInRage:options:usingBlock: hace lo que dice en la lata: enumera las subcadenas, que se definen por lo que pasa como las opciones. NSStringEnumerationByWords dice "Quiero palabras para mí", y NSStringEnumerationReverse dice "comience al final de la cadena en lugar de al principio".

Ya que estamos comenzando desde el final, la primera palabra que se nos da en substring será la última palabra de la cadena, por lo que establecer lastWord a que, a continuación, establecer el BOOL apuntado por stop a SÍ, por lo la enumeración se detiene de inmediato.

lastWord es, por supuesto, definido como __block para que podamos ponerlo en el interior del bloque y verlo fuera, y es inicializado a nil que si la cadena tiene hay palabras (por ejemplo, si está vacío o tiene que ver con puntuacion) nos no se cuelgue cuando intentemos usar lastWord.

+0

¿Puedes explicar un poco? –

+0

Claro. Déjame actualizar mi publicación. – Wevah

+0

¡Muchas gracias por su explicación! –

0

Puede leer símbolos del final de su cadena y copiarlos en el índice 0 para dar como resultado la cadena. Si lee el espacio o la coma, la cadena de resultado contendrá la última palabra

1

Es probable que la forma más eficiente comience al final de la cadena, examine cada carácter para ver si es parte de lo que define como palabra, y luego extraiga la palabra que desee usando substringFromIndex: o substringWithRange:.

11

seguirlo:

NSRange range = [someNSStringHere rangeOfString:@" " options:NSBackwardsSearch]; 
NSString *result = [someNSStringHere substringFromIndex:range.location+1]; 
+0

Estoy de acuerdo. Comienza desde el final, un personaje a la vez, hasta que llegues a un espacio, una coma o cualquier otro delimitador que puedas prever. –

+1

Si no se encuentra '@" "', puede usar la cadena completa en su lugar. Haría esto: 'NSRange range = [someString rangeOfString: @" "options: NSBackwardsSearch]; NSString * lastWord = someString; if (range.location! = NSNotFound) {lastWord = [self substringFromIndex: range.location + 1]; } ' –

0

Usted podría utilizar NSString 's función rangeOfSubstring:options: para determinarla. Por ejemplo:

Busca en la cadena un espacio, usando una opción de búsqueda hacia atrás para iniciar la búsqueda desde el final de la cadena.

NSRange r = [string rangeOfString:@" " options:NSBackwardsSearch];

Esto encontrar la ubicación de la última palabra de la cadena. Ahora acaba de obtener la cadena usando substringWithRange: Por ejemplo:

NSRange found = NSMakeRange(NSMaxRange(r), string.length - NSMaxRange(r)); NSString *foundString = [string substringWithRange:found];

Dónde r es el rango de antes.

También tenga cuidado para asegurarse de que realmente r existe. Si solo hay 1 palabra en la cadena, entonces r será {NSNotFound, 0}

Espero que pueda ayudar!

Ben

2

Si desea utilizar una expresión regular (que puede ser útil si quiere empezar a ser más complicado en términos de lo que está buscando al final de la cadena), podría hacer algo como:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\S+\\Z" options:0 error:nil]; 
NSTextCheckingResult *found = [regex firstMatchInString:inputString options:0 range:NSMakeRange(0, [inputString length])]; 

if (found.range.location != NSNotFound) 
    result = [inputString substringWithRange:found.range]; 
3

Eso funciona muy bien, ya que también reconoce símbolos como @ y # que enumerateSubstringsInRange: no hace.

NSCharacterSet *charSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; 
NSArray *components = [someString componentsSeparatedByCharactersInSet:charSet]; 
NSString *lastWord = components.lastObject; 
Cuestiones relacionadas