(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.
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
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.
Ce code prend des blancs.
NSString *trimmedText = [strResult stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@",trimmedText);
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];
}
NSString *myText = @" foo ";
NSString *trimmedText = [myText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSLog(@"old = [%@], trimmed = [%@]", myText, trimmedText);
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.
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.