如何从NSString的右端删除空格?

| 这将删除字符串两端的空白:
NSString *newString = [oldString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
如何从字符串的右端删除空格? 更新:接受的答案中的代码现在是SSToolkit的一部分。好极了!     
已邀请:
更新:快速基准测试表明,基于Max和我的Matt自己的改编效果最佳。
@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
然后:
NSString *trimmedString = [yourString stringByTrimmingTrailingCharactersInSet:[NSCharacterset whitespaceAndNewlineCharacterSet]];
或领先的空格:
NSString *trimmedString = [yourString stringByTrimmingLeadingCharactersInSet:[NSCharacterset whitespaceAndNewlineCharacterSet]];
它以抽象的方式实现,因此您可以将其与任何可能的
NSCharacterSet
一起使用,
whitespaceAndNewlineCharacterSet
只是其中之一。 为了方便起见,您可能需要添加以下包装方法:
- (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]];
}
编辑:使用charBuffer恢复为初始版本,以获得更好的性能。     
在@Regexident和@Max的答案的基础上,我想出了以下方法:
@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
这是GHUnit测试,这些测试当然都可以通过:
@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提交了GitHub pull请求,其中添加了这些方法。     
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];
    
需要略微更改以解决最后一个非跟踪字符为多字节的情况:
- (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
}
    

要回复问题请先登录注册