objective-c nsstring trim strip removing-whitespace

objective c - ¿Cómo eliminar los espacios en blanco del extremo derecho de NSString?



objective-c trim (4)

Esto elimina el espacio en blanco de ambos extremos de una cadena:

NSString *newString = [oldString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

¿Cómo elimino los espacios en blanco del extremo derecho de una cadena?

ACTUALIZACIÓN: el código de la respuesta aceptada ahora es parte de SSToolkit . ¡Hurra!


Necesita un ligero cambio para tener en cuenta el caso cuando el último carácter no final es multibyte:

- (NSString *)stringByTrimmingTrailingCharactersInSet:(NSCharacterSet *)characterSet { NSRange rangeOfLastWantedCharacter = [self rangeOfCharacterFromSet:[characterSet invertedSet] options:NSBackwardsSearch]; if (rangeOfLastWantedCharacter.location == NSNotFound) { return @""; } return [self substringToIndex:rangeOfLastWantedCharacter.location + rangeOfLastWantedCharacter.length]; // non-inclusive }


Sobre la base de las respuestas de @Regexident y @Max, se me ocurrieron los siguientes métodos:

@implementation NSString (SSToolkitAdditions) #pragma mark Trimming Methods - (NSString *)stringByTrimmingLeadingCharactersInSet:(NSCharacterSet *)characterSet { NSRange rangeOfFirstWantedCharacter = [self rangeOfCharacterFromSet:[characterSet invertedSet]]; if (rangeOfFirstWantedCharacter.location == NSNotFound) { return @""; } return [self substringFromIndex:rangeOfFirstWantedCharacter.location]; } - (NSString *)stringByTrimmingLeadingWhitespaceAndNewlineCharacters { return [self stringByTrimmingLeadingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; } - (NSString *)stringByTrimmingTrailingCharactersInSet:(NSCharacterSet *)characterSet { NSRange rangeOfLastWantedCharacter = [self rangeOfCharacterFromSet:[characterSet invertedSet] options:NSBackwardsSearch]; if (rangeOfLastWantedCharacter.location == NSNotFound) { return @""; } return [self substringToIndex:rangeOfLastWantedCharacter.location+1]; // non-inclusive } - (NSString *)stringByTrimmingTrailingWhitespaceAndNewlineCharacters { return [self stringByTrimmingTrailingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; } @end

Y aquí están las pruebas de GHUnit, que todos pasan por supuesto:

@interface StringCategoryTest : GHTestCase @end @implementation StringCategoryTest - (void)testStringByTrimmingLeadingCharactersInSet { NSCharacterSet *letterCharSet = [NSCharacterSet letterCharacterSet]; GHAssertEqualObjects([@"zip90210zip" stringByTrimmingLeadingCharactersInSet:letterCharSet], @"90210zip", nil); } - (void)testStringByTrimmingLeadingWhitespaceAndNewlineCharacters { GHAssertEqualObjects([@"" stringByTrimmingLeadingWhitespaceAndNewlineCharacters], @"", nil); GHAssertEqualObjects([@"/n /n " stringByTrimmingLeadingWhitespaceAndNewlineCharacters], @"", nil); GHAssertEqualObjects([@"/n hello /n" stringByTrimmingLeadingWhitespaceAndNewlineCharacters], @"hello /n", nil); } - (void)testStringByTrimmingTrailingCharactersInSet { NSCharacterSet *letterCharSet = [NSCharacterSet letterCharacterSet]; GHAssertEqualObjects([@"zip90210zip" stringByTrimmingTrailingCharactersInSet:letterCharSet], @"zip90210", nil); } - (void)testStringByTrimmingTrailingWhitespaceAndNewlineCharacters { GHAssertEqualObjects([@"" stringByTrimmingLeadingWhitespaceAndNewlineCharacters], @"", nil); GHAssertEqualObjects([@"/n /n " stringByTrimmingLeadingWhitespaceAndNewlineCharacters], @"", nil); GHAssertEqualObjects([@"/n hello /n" stringByTrimmingTrailingWhitespaceAndNewlineCharacters], @"/n hello", nil); } @end

SSToolkit una solicitud de extracción de GitHub a SSToolkit con estos métodos agregados.


ACTUALIZACIÓN: un punto de referencia rápido mostró que la propia adaptación de Matt , basada en Max'' & mine, se desempeña mejor.

@implementation NSString (TrimmingAdditions) - (NSString *)stringByTrimmingLeadingCharactersInSet:(NSCharacterSet *)characterSet { NSUInteger location = 0; NSUInteger length = [self length]; unichar charBuffer[length]; [self getCharacters:charBuffer]; for (location; location < length; location++) { if (![characterSet characterIsMember:charBuffer[location]]) { break; } } return [self substringWithRange:NSMakeRange(location, length - location)]; } - (NSString *)stringByTrimmingTrailingCharactersInSet:(NSCharacterSet *)characterSet { NSUInteger location = 0; NSUInteger length = [self length]; unichar charBuffer[length]; [self getCharacters:charBuffer]; for (length; length > 0; length--) { if (![characterSet characterIsMember:charBuffer[length - 1]]) { break; } } return [self substringWithRange:NSMakeRange(location, length - location)]; } @end

y entonces:

NSString *trimmedString = [yourString stringByTrimmingTrailingCharactersInSet:[NSCharacterset whitespaceAndNewlineCharacterSet]];

o para los principales espacios en blanco:

NSString *trimmedString = [yourString stringByTrimmingLeadingCharactersInSet:[NSCharacterset whitespaceAndNewlineCharacterSet]];

Se implementa de manera abstracta, de modo que puede usarlo con cualquier posible NSCharacterSet , ya que solo uno de ellos es el whitespaceAndNewlineCharacterSet y el NSCharacterSet de caracteres de línea.

Por conveniencia, es posible que desee agregar estos métodos de envoltura:

- (NSString *)stringByTrimmingLeadingWhitespace { return [self stringByTrimmingLeadingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; } - (NSString *)stringByTrimmingTrailingWhitespace { return [self stringByTrimmingTrailingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; } - (NSString *)stringByTrimmingLeadingWhitespaceAndNewline { return [self stringByTrimmingLeadingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; } - (NSString *)stringByTrimmingTrailingWhitespaceAndNewline { return [self stringByTrimmingTrailingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; }

Edición: volvió a la versión inicial utilizando charBuffer para un mejor rendimiento.


NSString* str = @"hdskfh dsakjfh akhf kasdhfk asdfkjash fkadshf1234 "; NSRange rng = [str rangeOfCharacterFromSet: [NSCharacterSet characterSetWithCharactersInString: [str stringByReplacingOccurrencesOfString: @" " withString: @""]] options: NSBackwardsSearch]; str = [str substringToIndex: rng.location+1];