web-dev-qa-db-fra.com

Cocoa - Coupez tous les grands espaces de NSString

(ont cherché, mais pas pu trouver une solution simple à celle-ci ici, ou dans les documents Cocoa)

Q. Comment puis-je supprimer tous les interligne espaces blancs uniquement à partir d'une chaîne NSS? (c'est-à-dire en laissant intact tout autre espace blanc.)

Malheureusement, pour mes besoins, la méthode stringByTrimmingCharactersInSet de NSString fonctionne à la fois en début et en fin.

Compatibilité Mac OS X 10.4 nécessaire, GC manuel.

44
SirRatty

Cela crée une catégorie NSString pour faire ce dont vous avez besoin. Avec cela, vous pouvez appeler NSString *newString = [mystring stringByTrimmingLeadingWhitespace]; pour obtenir une copie moins le premier espace blanc. (Le code n'est pas testé, peut nécessiter un débogage mineur.)

@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
68
John Franklin

Il s'agit d'une autre solution utilisant des expressions régulières (nécessite iOS 3.2):

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

Et si vous souhaitez couper les espaces de fin uniquement, vous pouvez utiliser @"\\s*$" au lieu.

49
Hejazi

Ce code prend des blancs.

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

NSLog(@"%@",trimmedText);

36
aybars

Voici une manière très efficace (utilise CoreFoundation) de le faire (tirée de kissxml):

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

    NSString *result = [mStr copy];

    [mStr release];
    return [result autorelease];
}
25
Yosi Taguri
 NSString *myText = @"       foo    ";    
 NSString *trimmedText = [myText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
 NSLog(@"old = [%@], trimmed = [%@]", myText, trimmedText);
21
Ramesh

Voici ce que je ferais, et cela n'implique pas de catégories!

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

C'est beaucoup moins de code.

3
lucius

Je n'ai pas vraiment eu beaucoup de temps pour tester cela, et je ne sais pas si 10.4 contient la méthode UTF8String pour NSString, mais voici comment je le ferais:

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

Ce n'est peut-être pas le moyen le plus efficace de le faire, mais cela devrait fonctionner.

0
LandonSchropp