web-dev-qa-db-fra.com

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

Prenons l'exemple suivant:

"    Hello      this  is a   long       string!   "

Je veux convertir cela en:

"Hello this is a long string!"
122
Paul

OS X 10.7+ et iOS 3.2+

Utilisez la solution native solution rationnelle fournie par hfossli.

Autrement

Utilisez votre bibliothèque regexp préférée ou utilisez la solution Cocoa-native 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:@" "];
124
Georg Schölly

Regex et NSCharacterSet sont là pour vous aider. Cette solution supprime les espaces 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]];

Journalisation final donne

"Hello this is a long string!"

Modèles de regex alternatifs possibles:

  • Remplacer uniquement l'espace: [ ]+
  • Remplacer l'espace et les tabulations: [ \\t]+
  • Remplacez l’espace, les tabulations et les nouvelles lignes: \\s+

aperçu 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.

52
hfossli

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 )

40
arikfr

Avec une expression régulière, mais sans la nécessité d'un cadre externe:

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

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

Une solution en une ligne:

NSString *whitespaceString = @" String with whitespaces ";

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

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:@" "];
6
Barry Wark

Une autre option pour regex dans Regex KitLite , très facile à intégrer dans un projet iPhone:

[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
4
Daniel Dickison

Essaye ça

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

while ([theString rangeOfString:@"  "].location != NSNotFound) {
    theString = [theString stringByReplacingOccurrencesOfString:@"  " withString:@" "];
}
3
sinh99

Voici un extrait d'une extension NSString, où "self" est l'instance NSString. Il peut être utilisé pour réduire des espaces contigus en un seul espace en passant [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;
}
3
dmercredi