从NSString的末尾删除空格

372

我需要从字符串末尾删除空格。我该如何做? 示例:如果字符串是"Hello ",则必须变为"Hello"


1
有一个 Swift 版本。https://dev59.com/_l8d5IYBdhLWcg3wcx9V - tounaobun
14个回答

903

翻译自这里的答案:https://dev59.com/8G025IYBdhLWcg3w_a6r#5691567

- (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
}

157
若需包含换行符在字符集中,请使用 whitespaceAndNewlineCharacterSet - penfold
9
小提示:该方法会去除字符串两端的空格,但不会移除字符串内部的空格。 - Alex
10
不回答问题怎么会获得这么多赞,我不明白。你提供的解决方案也移除了字符串开头的空格,这并不符合要求。 - James Boutcher
5
这个回答会得到很多点赞的原因是我们在谷歌上搜索“剪切NSString”的时候找到了这个答案,它是针对那个问题的正确答案。虽然问问题的人要求的是其他东西。 - Dan Rosenstark
对于关注Emoji的情况,最后一行应为 return [self substringToIndex:rangeOfLastWantedCharacter.location + rangeOfLastWantedCharacter.length]; - vinsent

21

另一种解决方案是创建可变字符串:

//make mutable string
NSMutableString *stringToTrim = [@" i needz trim " mutableCopy];

//pass it by reference to CFStringTrimSpace
CFStringTrimWhiteSpace((__bridge CFMutableStringRef) stringToTrim);

//stringToTrim is now "i needz trim"

13

这是你需要的...

- (NSString *)removeEndSpaceFrom:(NSString *)strtoremove{
    NSUInteger location = 0;
    unichar charBuffer[[strtoremove length]];
    [strtoremove getCharacters:charBuffer];
    int i = 0;
    for(i = [strtoremove length]; i >0; i--) {
        NSCharacterSet* charSet = [NSCharacterSet whitespaceCharacterSet];
        if(![charSet characterIsMember:charBuffer[i - 1]]) {
            break;
        }
    }
    return [strtoremove substringWithRange:NSMakeRange(location, i  - location)];
}

现在只需调用它。假设你有一个字符串,在前面和后面都有空格,你只想去掉末尾的空格,可以像这样调用:

NSString *oneTwoThree = @"  TestString   ";
NSString *resultString;
resultString = [self removeEndSpaceFrom:oneTwoThree];

resultString 最终将没有末尾的空格。


11
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                              [NSCharacterSet whitespaceAndNewlineCharacterSet]];
//for remove whitespace and new line character

NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                              [NSCharacterSet punctuationCharacterSet]]; 
//for remove characters in punctuation category

还有许多其他的字符集。根据您的需求自行检查。


1
这不会修剪所有的空格和换行符吗?问题是如何从末尾修剪。 - Giorgos Ath
@giorgos-ath - 是的,它会从末尾删除空格。 - g212gs
问题是关于从结尾删除。这个答案是从开头和结尾同时删除。因此,这不是一个有效的答案。 - Patrick

9

在Swift中仅从字符串开头和结尾去除空格:

Swift 3

您可以使用以下代码来去除字符串开头和结尾的空格:
string.trimmingCharacters(in: .whitespacesAndNewlines)

之前的 Swift 版本

string.stringByTrimmingCharactersInSet(.whitespaceAndNewlineCharacterSet()))

1
这不会修剪所有的空格和换行符吗?问题是如何从末尾修剪。 - Giorgos Ath
@GiorgosAth 不,这只会修剪字符串的开头或结尾的字符。根据苹果文档上 stringByTrimmigCharactersInSet: 的说明 - “返回一个新字符串,它从接收者两端删除给定字符集中包含的字符。” https://developer.apple.com/reference/foundation/nsstring/1415462-stringbytrimmingcharactersinset?language=objc - lostAtSeaJoshua
@GiorgosAth 这段代码与被接受的答案完全相同,只是用Swift编写。 - lostAtSeaJoshua
问题是关于从末尾删除的。这个答案是从开头和结尾都删除。因此,这不是一个有效的答案。 - Patrick

4

Swift版本

仅剪裁字符串末尾的空格:

private func removingSpacesAtTheEndOfAString(var str: String) -> String {
    var i: Int = countElements(str) - 1, j: Int = i

    while(i >= 0 && str[advance(str.startIndex, i)] == " ") {
        --i
    }

    return str.substringWithRange(Range<String.Index>(start: str.startIndex, end: advance(str.endIndex, -(j - i))))
}

去除字符串两端的空格:

var str: String = " Yolo "
var trimmedStr: String = str.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())

1
问题是关于删除字符串末尾的空格。您的代码将两侧都删除了。 - JakubKnejzlik
这段代码无法编译。countElements()和advance()方法未被定义。 - petrsyn

4

这将仅删除您选择的尾随字符。

func trimRight(theString: String, charSet: NSCharacterSet) -> String {

    var newString = theString

    while String(newString.characters.last).rangeOfCharacterFromSet(charSet) != nil {
        newString = String(newString.characters.dropLast())
    }

    return newString
}

3

在Swift中

要从字符串两侧删除空格和换行符:

var url: String = "\n   http://example.com/xyz.mp4   "
var trimmedUrl: String = url.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())

3

在Objective-C中只修剪一个端而不是两个端的简单解决方案:

@implementation NSString (category)

/// trims the characters at the end
- (NSString *)stringByTrimmingSuffixCharactersInSet:(NSCharacterSet *)characterSet {
    NSUInteger i = self.length;
    while (i > 0 && [characterSet characterIsMember:[self characterAtIndex:i - 1]]) {
        i--;
    }
    return [self substringToIndex:i];
}

@end

还有一个对称的实用程序,只用于修剪开头:

@implementation NSString (category)

/// trims the characters at the beginning
- (NSString *)stringByTrimmingPrefixCharactersInSet:(NSCharacterSet *)characterSet {
    NSUInteger i = 0;
    while (i < self.length && [characterSet characterIsMember:[self characterAtIndex:i]]) {
        i++;
    }
    return [self substringFromIndex:i];
}

@end

3

如果您希望删除所有尾部空格字符(我猜这实际上是您的意图),以下是一种相当简洁干净的方法。

Swift 5:

let trimmedString = string.replacingOccurrences(of: "\\s+$", with: "", options: .regularExpression)

Objective-C:

NSString *trimmedString = [string stringByReplacingOccurrencesOfString:@"\\s+$" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, string.length)];

一行代码,配合正则表达式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接