Réponses:
Utilisez la solution d'expression régulière native fournie par hfossli.
Utilisez votre bibliothèque de regexp préférée ou utilisez la solution native Cocoa suivante:
NSString *theString = @" Hello this is a long string! ";
NSCharacterSet *whitespaces = [NSCharacterSet whitespaceCharacterSet];
NSPredicate *noEmptyStrings = [NSPredicate predicateWithFormat:@"SELF != ''"];
NSArray *parts = [theString componentsSeparatedByCharactersInSet:whitespaces];
NSArray *filteredArray = [parts filteredArrayUsingPredicate:noEmptyStrings];
theString = [filteredArray componentsJoinedByString:@" "];
Regex et NSCharacterSet sont là pour vous aider. Cette solution supprime les espaces blancs de début et de fin ainsi que plusieurs espaces.
NSString *original = @" Hello this is a long string! ";
NSString *squashed = [original stringByReplacingOccurrencesOfString:@"[ ]+"
withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, original.length)];
NSString *final = [squashed stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
La journalisation final
donne
"Hello this is a long string!"
Modèles de regex alternatifs possibles:
[ ]+
[ \\t]+
\\s+
La facilité d'extension, les performances, le nombre de lignes de code et le nombre d'objets créés rendent cette solution appropriée.
stringByReplacingOccurrencesOfString:
. Je ne peux pas croire que je ne le savais pas.
En fait, il existe une solution très simple à cela:
NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)
( Source )
Avec une regex, mais sans besoin de framework externe:
NSString *theString = @" Hello this is a long string! ";
theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, theString.length)];
NSRegularExpressionSearch
dit que cela ne fonctionne qu'avec les rangeOfString:...
méthodes
Une solution en une seule ligne:
NSString *whitespaceString = @" String with whitespaces ";
NSString *trimmedString = [whitespaceString
stringByReplacingOccurrencesOfString:@" " withString:@""];
Cela devrait le faire ...
NSString *s = @"this is a string with lots of white space";
NSArray *comps = [s componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSMutableArray *words = [NSMutableArray array];
for(NSString *comp in comps) {
if([comp length] > 1)) {
[words addObject:comp];
}
}
NSString *result = [words componentsJoinedByString:@" "];
Une autre option pour regex est RegexKitLite , qui est très facile à intégrer dans un projet iPhone:
[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
Voici un extrait d'une NSString
extension, où se "self"
trouve l' NSString
instance. Il peut être utilisé pour réduire les espaces blancs contigus en un seul espace en transmettant [NSCharacterSet whitespaceAndNewlineCharacterSet]
et ' '
aux deux arguments.
- (NSString *) stringCollapsingCharacterSet: (NSCharacterSet *) characterSet toCharacter: (unichar) ch {
int fullLength = [self length];
int length = 0;
unichar *newString = malloc(sizeof(unichar) * (fullLength + 1));
BOOL isInCharset = NO;
for (int i = 0; i < fullLength; i++) {
unichar thisChar = [self characterAtIndex: i];
if ([characterSet characterIsMember: thisChar]) {
isInCharset = YES;
}
else {
if (isInCharset) {
newString[length++] = ch;
}
newString[length++] = thisChar;
isInCharset = NO;
}
}
newString[length] = '\0';
NSString *result = [NSString stringWithCharacters: newString length: length];
free(newString);
return result;
}
Solution alternative: procurez-vous une copie d'OgreKit (la bibliothèque d'expressions régulières Cocoa).
La fonction entière est alors:
NSString *theStringTrimmed =
[theString stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression *regex =
[OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);
Court et doux.
Si vous recherchez la solution la plus rapide, une série d'instructions soigneusement élaborées fonctionnera NSScanner
probablement mieux, mais cela ne sera nécessaire que si vous prévoyez de traiter d'énormes blocs de texte (plusieurs mégaoctets).
selon @Mathieu Godart est la meilleure réponse, mais il manque une ligne, toutes les réponses réduisent juste l'espace entre les mots, mais si elles ont des tabulations ou ont une tabulation en place, comme ceci: "c'est du texte \ t, et \ tTab entre, ainsi de suite "en trois lignes de code, nous allons: la chaîne que nous voulons réduire les espaces blancs
NSString * str_aLine = @" this is text \t , and\tTab between , so on ";
// replace tabs to space
str_aLine = [str_aLine stringByReplacingOccurrencesOfString:@"\t" withString:@" "];
// reduce spaces to one space
str_aLine = [str_aLine stringByReplacingOccurrencesOfString:@" +" withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, str_aLine.length)];
// trim begin and end from white spaces
str_aLine = [str_aLine stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
le résultat est
"this is text , and Tab between , so on"
sans remplacer l'onglet, le résultat sera:
"this is text , and Tab between , so on"
Vous pouvez également utiliser un simple argument while. Il n'y a pas de magie RegEx là-dedans, alors c'est peut-être plus facile à comprendre et à modifier à l'avenir:
while([yourNSStringObject replaceOccurrencesOfString:@" "
withString:@" "
options:0
range:NSMakeRange(0, [yourNSStringObject length])] > 0);
Suivre deux expressions régulières fonctionnerait selon les besoins
Appliquez ensuite la méthode d'instance de nsstring stringByReplacingOccurrencesOfString:withString:options:range:
pour les remplacer par un seul espace blanc.
par exemple
[string stringByReplacingOccurrencesOfString:regex withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])];
Remarque: je n'ai pas utilisé la bibliothèque 'RegexKitLite' pour la fonctionnalité ci-dessus pour iOS 5.x et supérieur.