2010-07-08 14 views
43

(han buscado, pero no han sido capaces de encontrar una solución simple a éste, ya sea aquí o en documentos de cacao)Cacao - Recorte todos los espacios en blanco que va desde NSString

P. ¿Cómo puedo recortar todo líder espacios en blanco solo desde un NSString? (es decir, dejando intactos otros espacios en blanco)

Desafortunadamente, para mi propósito, el método stringByTrimmingCharactersInSet de NSString funciona tanto en el inicio como en el final.

Compatibilidad con Mac OS X 10.4, GC manual.

Respuesta

67

Esto crea una categoría NSString para hacer lo que necesita. Con esto, puede llamar al NSString *newString = [mystring stringByTrimmingLeadingWhitespace]; para obtener una copia menos el espacio en blanco inicial. (Código no se ha probado, puede ser necesaria una depuración de menor importancia.)

@interface NSString (trimLeadingWhitespace) 
-(NSString*)stringByTrimmingLeadingWhitespace; 
@end 

@implementation NSString (trimLeadingWhitespace) 
-(NSString*)stringByTrimmingLeadingWhitespace { 
    NSInteger i = 0; 

    while ((i < [self length]) 
      && [[NSCharacterSet whitespaceCharacterSet] characterIsMember:[self characterAtIndex:i]]) { 
     i++; 
    } 
    return [self substringFromIndex:i]; 
} 
@end 
+0

Muchas gracias Juan, y todos los que ayudaron. Si cambio la línea NSInteger para la compatibilidad 10.4, funciona muy bien. Aclamaciones. – SirRatty

+0

Olvidé que 10.4 no tiene NSInteger. La mayor parte de mi trabajo se dirige a dispositivos móviles, por lo que ha pasado un tiempo desde que hice algo por Tiger. ¡Me alegra que funcionó! –

+0

Buena edición, Sr. Hudak. –

0

que realmente no tienen mucho tiempo para probar esto, y no estoy seguro de si el método 10.4 contiene UTF8String para NSString, pero así es como yo 'd hacerlo:

NSString + Trimming.h

#import <Foundation/Foundation.h> 

@interface NSString (Trimming) 

-(NSString *) stringByTrimmingWhitespaceFromFront; 

@end 

NSString + Trimming.m

#import "NSString+Trimming.h" 

@implementation NSString (Trimming) 

-(NSString *) stringByTrimmingWhitespaceFromFront 
{ 
    const char *cStringValue = [self UTF8String]; 

    int i; 
    for (i = 0; cStringValue[i] != '\0' && isspace(cStringValue[i]); i++); 

    return [self substringFromIndex:i]; 
} 

@end 

Puede que no sea la forma más eficiente de hacerlo, pero debería funcionar.

+0

¿Dónde está la cuerda que se está recortando en el código anterior? ¿Definitivamente necesitamos escribir un método para esto? –

3

Esto es lo que haría, ¡y no incluye categorías!

NSString* outputString = inputString; 
NSRange range = [inputString rangeOfCharacterFromSet: [NSCharacterSet whitespaceCharacterSet] 
    options:0]; 
if (range.location == 0) 
    outputString = [inputString substringFromIndex: range.location + range.length]; 

Esto es mucho menos código.

+3

Es solo un código menor si solo desea recortar el espacio en blanco en un lugar de su aplicación. – JeremyP

+0

Sería más rápido si pasara en la opción NSAnchoredSearch –

+0

@JeremyP siempre podría poner este código en una categoría. Todavía es menos código. –

49

Esta es otra solución utilizando expresiones regulares (requiere iOS 3.2):

NSRange range = [string rangeOfString:@"^\\s*" options:NSRegularExpressionSearch]; 
NSString *result = [string stringByReplacingCharactersInRange:range withString:@""]; 

Y si quiere recortar los espacios en blanco sólo por detrás se puede utilizar en lugar @"\\s*$".

+0

¿Esto no elimina tanto los caracteres iniciales como los finales? – SirRatty

+1

Sí, tienes razón. No me di cuenta de que desea eliminar los espacios principales en blanco solamente. De todos modos, cambié la respuesta, compruebalo nuevamente. – Hejazi

+0

Hiciste mi día :-) Genial, muchas gracias –

25

Aquí es una forma muy eficiente (utiliza CoreFoundation) de hacerlo (Tomado de kissxml):

- (NSString *)trimWhitespace { 
    NSMutableString *mStr = [self mutableCopy]; 
    CFStringTrimWhitespace((CFMutableStringRef)mStr); 

    NSString *result = [mStr copy]; 

    [mStr release]; 
    return [result autorelease]; 
} 
+0

La pregunta es para recortar el espacio en blanco líder; estos recortes también van a la baja –

+0

oops, tienes razón –

+0

@YosiTaguri, ¿cómo puedo llamar a este método? para recortar mi NSString –

21
NSString *myText = @"  foo ";  
NSString *trimmedText = [myText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
NSLog(@"old = [%@], trimmed = [%@]", myText, trimmedText); 
+0

Perfecto. Buena respuesta . Por favor, sigue esta publicación. –

36

Este código está tomando espacios en blanco.

NSString *trimmedText = [strResult stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

NSLog(@"%@",trimmedText);

+1

Esto eliminará los espacios en blanco iniciales y finales y los caracteres de nueva línea, mientras que la pregunta es cómo eliminar SOLAMENTE aquellos al principio. – alasker

-5
str = [str stringByReplacingOccurrencesOfString:@" " withString:@""]; 
+1

@ "Esta cadena"; se convierte en @ "Thisstring"; . El autor dijo que todos los demás espacios en blanco deben permanecer intactos. – bneely

+0

Lea la pregunta antes de publicar una respuesta. La pregunta es sobre recortar una cuerda en ambos lados. – codetiger

Cuestiones relacionadas