【问题标题】:Cocoa - Trim all leading whitespace from NSStringCocoa - 从 NSString 中修剪所有前导空格
【发布时间】:2011-03-13 03:31:05
【问题描述】:

(已搜索,但无法在此处或 Cocoa 文档中找到简单的解决方案)

问。如何仅从 NSString 中修剪所有 前导 空格? (即保持任何其他空白不变。)

不幸的是,就我的目的而言,NSString 的 stringByTrimmingCharactersInSet 方法适用于前导和尾随。

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

【问题讨论】:

    标签: cocoa nsstring whitespace trim


    【解决方案1】:

    这将创建一个 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
    

    【讨论】:

    • 非常感谢约翰,以及所有提供帮助的人。如果我将 NSInteger 行更改为与 10.4 兼容,它会很好用。干杯。
    • 我忘了 10.4 没有 NSInteger。我的大部分工作都针对移动设备,所以我已经有一段时间没有为 Tiger 做任何事情了。我很高兴它成功了!
    • 这很有帮助。一个错字:“idx”在 while 循环中应该是“i”。
    • 不要使用自己的while循环,而是使用NSString rangeOfCharacterFromSet:NSString stringByTrimmingCharactersInSet:,或者如果您需要灵活性,请使用NSScanner对象甚至Reg Ex。查看此问题的其他答案(目前他们的赞成票较少)。
    【解决方案2】:

    我真的没有太多时间来测试这个,我不确定 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
    

    这可能不是最有效的方法,但应该可以。

    【讨论】:

    • 上面代码中被修剪的字符串在哪里?我们真的需要为此编写一个方法吗?
    【解决方案3】:

    这就是我要做的,它不涉及类别!

    NSString* outputString = inputString;
    NSRange range = [inputString rangeOfCharacterFromSet: [NSCharacterSet whitespaceCharacterSet]
        options:0];
    if (range.location == 0) 
        outputString = [inputString substringFromIndex: range.location + range.length];
    

    这是更少的代码。

    【讨论】:

    • 如果你只想在你的应用程序的一个地方修剪空白,这只是更少的代码。
    • 如果你传入 NSAnchoredSearch 选项也会更快
    • @JeremyP 你总是可以把这个代码放在一个类别中。它仍然是更少的代码。
    • rangeOfCharacterFromSet: 返回字符串中第一个字符的范围。这只会删除第一个空白字符,而不是所有前导。
    【解决方案4】:

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

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

    如果您只想修剪尾随空格,则可以改用@"\\s*$"

    【讨论】:

    • 这不会同时修剪前导和结尾字符吗?
    • 是的,你是对的。我没有注意到您只想删除前导空格。反正我改了答案,再看一遍。
    • 你让我开心 :-) 太好了,非常感谢
    • 这个解决方案更加简洁!谢谢!
    【解决方案5】:

    这是一种非常有效的(使用CoreFoundation)方法(取自kissxml):

    - (NSString *)trimWhitespace {
        NSMutableString *mStr = [self mutableCopy];
        CFStringTrimWhitespace((CFMutableStringRef)mStr);
    
        NSString *result = [mStr copy];
    
        [mStr release];
        return [result autorelease];
    }
    

    【讨论】:

    • 问题是修剪前导空白;这也修剪了尾随
    • @YosiTaguri,我该如何称呼这个方法?修剪我的 NSString
    • 如果您也不介意修剪尾随空格,那么这是完美的答案。
    • 感谢您的回答,并没有像许多简单的白带回答那样浪费 CPU
    【解决方案6】:
     NSString *myText = @"       foo    ";    
     NSString *trimmedText = [myText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
     NSLog(@"old = [%@], trimmed = [%@]", myText, trimmedText);
    

    【讨论】:

    • 完美的一个。不错的答案。请关注此帖。
    【解决方案7】:

    此代码为空白。

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

    NSLog(@"%@",trimmedText);

    【讨论】:

    • 这将删除前导和尾随空格和换行符,而问题是如何仅删除开头的那些..
    【解决方案8】:
    str = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
    

    【讨论】:

    • @"这个字符串";变成@"Thisstring"; .发起人表示,所有其他空白都需要保持不变。
    • 请在发布答案之前阅读问题。问题是关于修剪两边的字符串。