91 votes

Réduire les séquences d'espaces blancs en un seul caractère et supprimer les espaces vides dans la chaîne

Considérez l'exemple suivant :

"    Hello      this  is a   long       string!   "

Je veux le convertir en :

"Hello this is a long string!"

112voto

Georg Schölly Points 63123

OS X 10.7+ et iOS 3.2+

Utilisez la solution native regexp fournie par hfossli.

Sinon

Utilisez votre bibliothèque regexp préférée ou utilisez la solution Cocoa-native suivante:

NSString *theString = @"    Bonjour      c'est  une   longue       chaîne!   ";

NSCharacterSet *whitespaces = [NSCharacterSet whitespaceCharacterSet];
NSPredicate *noEmptyStrings = [NSPredicate predicateWithFormat:@"SELF != ''"];

NSArray *parts = [theString componentsSeparatedByCharactersInSet:whitespaces];
NSArray *filteredArray = [parts filteredArrayUsingPredicate:noEmptyStrings];
theString = [filteredArray componentsJoinedByString:@" "];

44voto

arikfr Points 1918

En fait, il y a une solution très simple à cela:

NSString *string = @" espaces devant et à la fin ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                                  [NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)

(Source)

21voto

hfossli Points 6815

Les Regex et NSCharacterSet sont là pour vous aider. Cette solution supprime les espaces vides en début et en fin de chaîne, ainsi que les espaces multiples.

NSString *original = @"    Bonjour      ceci  est une   longue       chaîne!   ";

NSString *squashed = [original stringByReplacingOccurrencesOfString:@"[ ]+"
                                                         withString:@" "
                                                            options:NSRegularExpressionSearch
                                                              range:NSMakeRange(0, original.length)];

NSString *final = [squashed stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

Lorsque vous affichez final, vous obtiendrez

"Bonjour ceci est une longue chaîne!"

Exemples de motifs de regex alternatifs :

  • Remplacer seulement les espaces : [ ]+
  • Remplacer les espaces et les tabulations : [ \\t]+
  • Remplacer les espaces, les tabulations et les sauts de ligne : \\s+

Analyse des performances

La facilité d'extension, les performances, le nombre de lignes de code et le nombre d'objets créés rendent cette solution appropriée.

13voto

TwoBeerGuy Points 567

Une solution en une seule ligne :

NSString *whitespaceString = @" Chaîne avec des espaces ";

NSString *trimmedString = [whitespaceString
        stringByReplacingOccurrencesOfString:@" " withString:@""];

13voto

MonsieurDart Points 3133

Avec une expression régulière, mais sans avoir besoin d'aucun framework externe :

NSString *theString = @"    Hello      this  is a   long       string!   ";

theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
                       options:NSRegularExpressionSearch
                       range:NSMakeRange(0, theString.length)];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X