从 NSString 的末尾修剪空格

Posted

技术标签:

【中文标题】从 NSString 的末尾修剪空格【英文标题】:Trim spaces from end of a NSString 【发布时间】:2011-08-11 00:08:33 【问题描述】:

我需要删除字符串末尾的空格。我怎样才能做到这一点? 示例:如果字符串为"Hello ",则它必须变为"Hello"

【问题讨论】:

它有一个 Swift 版本。***.com/questions/26797739/… 【参考方案1】:

取自这里的答案:https://***.com/a/5691567/251012

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

【讨论】:

要在字符集中包含换行符,请使用whitespaceAndNewlineCharacterSet 请注意:此方法会删除两端的空格。它不会从字符串内部删除空格。 我不明白为什么不回答这个问题会得到这么多的赞成票。您的解决方案也删除了字符串开头的空格,这不是所要求的。 @JamesBoutcher 之所以获得如此多的赞成票是因为我们在谷歌中寻找“trim NSString”,这是该问题的正确答案。确实,OP要求别的东西。【参考方案2】:

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

//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"

【讨论】:

【参考方案3】:

给你...

- (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 的末尾将没有空格。

【讨论】:

【参考方案4】:
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

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

【讨论】:

这不是要修剪所有空格和换行符吗?问题是如何从末端修剪。 @giorgos-ath - 是的,它从末尾删除了空格 问题是关于从最后删除。这个答案从头到尾都删除了。因此,这不是一个有效的答案。【参考方案5】:

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

斯威夫特 3

string.trimmingCharacters(in: .whitespacesAndNewlines)

以前的 Swift 版本

string.stringByTrimmingCharactersInSet(.whitespaceAndNewlineCharacterSet()))

【讨论】:

这不是要修剪所有空格和换行符吗?问题是如何从末端修剪。 @GiorgosAth 不,这只会修剪字符串开头或结尾的字符。来自stringByTrimmigCharactersInSet: 的苹果文档 - “返回一个新字符串,该字符串是通过从给定字符集中包含的接收器字符的两端删除而生成的。” developer.apple.com/reference/foundation/nsstring/… @GiorgosAth 这也与 Swift 中接受的答案完全相同。 问题是关于从最后删除。这个答案从头到尾都删除了。因此,这不是一个有效的答案。【参考方案6】:

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

【讨论】:

问题是关于最后修剪空格。您的代码修剪两边。 此代码无法编译。方法 countElements() 和 Advance() 没有定义。【参考方案7】:

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

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

【讨论】:

【参考方案8】:

在 Swift 中

从字符串的两侧修剪空格和换行符:

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

要修剪所有尾随空白字符(我猜这实际上是您的意图),以下是一种非常简洁明了的方法。

斯威夫特 5:

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

目标-C:

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

一行,带有一点正则表达式。

【讨论】:

【参考方案11】:

这里描述了解决方案:How to remove whitespace from right end of NSString?

将以下类别添加到 NSString:

- (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]];

你就这样使用它:

[yourNSString stringByTrimmingTrailingWhitespaceAndNewlineCharacters]

【讨论】:

【参考方案12】:

我想出了这个函数,它的行为基本上与 Alex 的回答中的一个相似:

-(NSString*)trimLastSpace:(NSString*)str
    int i = str.length - 1;
    for (; i >= 0 && [str characterAtIndex:i] == ' '; i--);
    return [str substringToIndex:i + 1];

whitespaceCharacterSet 除了空格本身还包括制表符,在我的情况下无法出现。所以我想一个简单的比较就足够了。

【讨论】:

【参考方案13】:

let string = "测试修剪后的字符串"

要删除空格和换行,请使用以下代码:-

让 str_trimmed = yourString.trimmingCharacters(in: .whitespacesAndNewlines)

仅从字符串中删除空格,请使用以下代码:-

让 str_trimmed = yourString.trimmingCharacters(in: .whitespaces)

【讨论】:

【参考方案14】:
NSString* NSStringWithoutSpace(NSString* string)

    return [string stringByReplacingOccurrencesOfString:@" " withString:@""];

【讨论】:

以上是关于从 NSString 的末尾修剪空格的主要内容,如果未能解决你的问题,请参考以下文章

修剪功能将内存大小减半以删除空格?

从 .NET 中的字符串末尾修剪字符串 - 为啥会丢失?

从链接开始修剪空格,并将空格添加到 A 标记之外

如何从 Spring MVC 中的请求参数中修剪空格

面试题:从一个字符串中修剪多个连续的空格

使用jQuery从textarea修剪前导/尾随空格?