Cocoa - 从NSString中删除所有前导空格

44

(我已经搜索过,但是无法在这里或Cocoa文档中找到简单的解决方案)

问:如何仅从NSString中删除所有前导空格?(即保留任何其他空格。)

不幸的是,对于我的目的,NSString的stringByTrimmingCharactersInSet方法适用于前导和尾随空格。

需要Mac OS X 10.4兼容性和手动GC。

8个回答

70

这创建了一个NSString类别来完成您所需的操作。使用此方法,您可以调用NSString *newString = [mystring stringByTrimmingLeadingWhitespace];来获取除前导空格外的副本。(代码未经测试,可能需要进行一些小的调试)

@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

非常感谢John和所有帮助过我的人。如果我将NSInteger行更改为10.4兼容性,它就可以正常工作。干杯。 - SirRatty
我忘了10.4没有NSInteger。我的大部分工作都是针对移动设备的,所以我已经有一段时间没有为Tiger做任何事情了。我很高兴它能够正常工作! - John Franklin
这非常有帮助。有一个笔误:while循环中的“idx”应该改为“i”。 - nont
3
不要再使用自己的 while 循环了,改用 NSString rangeOfCharacterFromSet:NSString stringByTrimmingCharactersInSet: 或者如果需要灵活性,可以选择 NSScanner 对象或者正则表达式。请参考本问题的其他答案(它们目前获得的 up-votes 较少)。 - Abhi Beckert

49

这是另一种使用正则表达式的解决方案(需要 iOS 3.2):

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

如果你只想修剪字符串末尾的空格,可以使用 @"\\s*$"


这个函数不是同时去掉字符串的首尾字符吗? - SirRatty
1
是的,你说得对。我没有注意到你只想删除前导空格。无论如何,我已经修改了答案,请再次检查。 - Hejazi
这个解决方案更加简洁!谢谢你! - pedroremedios

37

这段代码会去掉字符串两端的空格。

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

NSLog(@"%@",trimmedText);


1
这将删除前导和尾随的空格和换行符,而问题是如何仅删除开头的那些。 - alasker

26

这里有一种非常高效(使用了CoreFoundation)的方法来实现它(来自kissxml):

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

    NSString *result = [mStr copy];

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

问题是关于修剪前导空格的;这也会修剪尾随空格。 - Mike Abdullah
@YosiTaguri,我该如何调用这个方法,来修剪我的NSString? - Chatar Veer Suthar
如果您不介意删除尾随空格,那么这就是完美的答案。 - KPM
谢谢你的回答,不像许多简单的白带回答一样浪费CPU资源。<3 - Drew O'Meara

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

完美的回答。很好的答案。请关注这篇帖子。 - Abdul Yasin

3
这是我的建议,不涉及分类!
NSString* outputString = inputString;
NSRange range = [inputString rangeOfCharacterFromSet: [NSCharacterSet whitespaceCharacterSet]
    options:0];
if (range.location == 0) 
    outputString = [inputString substringFromIndex: range.location + range.length];

这段代码要少得多。


3
如果你只想在应用程序的一个地方修剪空格,那么使用这种方法代码量确实会减少。 - JeremyP
如果您传递 NSAnchoredSearch 选项,速度也会更快。 - Mike Abdullah
@JeremyP 你可以把这段代码放在一个类别里。这样仍然是更少的代码。 - Abhi Beckert
1
rangeOfCharacterFromSet: 返回字符串中的第一个字符范围。这仅会删除第一个空格字符,而不是所有前导空格字符。 - zpasternack

0

我没有太多时间来测试这个,也不确定10.4是否包含NSString的UTF8String方法,但是以下是我的做法:

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

这可能不是做这件事最有效的方法,但它应该可以工作。


以上代码中哪个字符串被修剪了?我们一定需要为此编写一个方法吗? - Pradeep Reddy Kypa

-6
str = [str stringByReplacingOccurrencesOfString:@" " withString:@""];

1
@" This string "; 变成了 @"Thisstring";。发起人表示所有其他空格都需要保持不变。 - bneely
请在回答之前阅读问题。该问题是关于修剪字符串两侧的内容。 - codetiger

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