Какао - обрезать все ведущие пробелы из NSString - PullRequest
44 голосов
/ 08 июля 2010

(искали, но не смогли найти простое решение для этого ни здесь, ни в Документах Какао)

Q. Как я могу обрезать все начальные пробелы только из строки NSString? (т. е. оставляя любые другие пробелы нетронутыми.)

К сожалению, для моих целей метод NSString stringByTrimmingCharactersInSet работает как в начале, так и в конце.

Требуется совместимость с Mac OS X 10.4, руководство GC.

Ответы [ 8 ]

68 голосов
/ 08 июля 2010

Это создает категорию 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
49 голосов
/ 28 декабря 2010

Это еще одно решение с использованием регулярных выражений (требуется iOS 3.2):

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

И если вы хотите обрезать только пробелы в конце, вы можете использовать @"\\s*$".

36 голосов
/ 08 мая 2012

Код принимает пробелы.

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

NSLog(@"%@",trimmedText);

25 голосов
/ 28 ноября 2011

Вот очень эффективный (использует CoreFoundation) способ сделать это (взято из kissxml):

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

    NSString *result = [mStr copy];

    [mStr release];
    return [result autorelease];
}
21 голосов
/ 20 апреля 2012
 NSString *myText = @"       foo    ";    
 NSString *trimmedText = [myText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
 NSLog(@"old = [%@], trimmed = [%@]", myText, trimmedText);
3 голосов
/ 08 июля 2010

Вот что я бы сделал, и это не касается категорий!

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

Это гораздо меньше кода.

0 голосов
/ 20 ноября 2012
str = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
0 голосов
/ 08 июля 2010

У меня не было много времени, чтобы проверить это, и я не уверен, содержит ли 10.4 метод UTF8String для NSString, но вот как я это сделаю:

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

Возможно, это не самый эффективный способ сделать это, но он должен работать.

...