Свернуть последовательности пробелов в один символ и обрезать строку - PullRequest
122 голосов
/ 17 апреля 2009

Рассмотрим следующий пример:

"    Hello      this  is a   long       string!   "

Я хочу преобразовать это в:

"Hello this is a long string!"

Ответы [ 13 ]

124 голосов
/ 15 сентября 2009

OS X 10.7+ и iOS 3.2 +

Используйте собственное решение регулярных выражений , предоставленное hfossli.

В противном случае

Либо используйте вашу любимую библиотеку регулярных выражений, либо используйте следующее решение Cocoa:

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:@" "];
52 голосов
/ 06 августа 2013

Regex и NSCharacterSet здесь, чтобы помочь вам. Это решение обрезает начальные и конечные пробелы, а также несколько пробелов.

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]];

Ведение журнала final дает

"Hello this is a long string!"

Возможные альтернативные шаблоны регулярных выражений:

  • Заменить только пробел: [ ]+
  • Заменить пробел и табуляцию: [ \\t]+
  • Заменить пробел, табуляции и новые строки: \\s+

Общее представление

Простота расширения, производительности, количества строк кода и количества созданных объектов делает это решение подходящим.

40 голосов
/ 15 сентября 2009

На самом деле, есть очень простое решение:

NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                                  [NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)

( Источник )

13 голосов
/ 04 ноября 2010

С регулярным выражением, но без необходимости каких-либо внешних рамок:

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

theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
                       options:NSRegularExpressionSearch
                       range:NSMakeRange(0, theString.length)];
9 голосов
/ 03 августа 2010

Решение в одну строку:

NSString *whitespaceString = @" String with whitespaces ";

NSString *trimmedString = [whitespaceString
        stringByReplacingOccurrencesOfString:@" " withString:@""];
6 голосов
/ 17 апреля 2009

Это должно сделать это ...

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:@" "];
4 голосов
/ 17 апреля 2009

Еще одна опция для регулярных выражений - это RegexKitLite , которую очень легко встроить в проект iPhone:

[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
3 голосов
/ 15 марта 2012

Попробуйте

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

while ([theString rangeOfString:@"  "].location != NSNotFound) {
    theString = [theString stringByReplacingOccurrencesOfString:@"  " withString:@" "];
}
3 голосов
/ 17 апреля 2009

Вот фрагмент из расширения NSString, где "self" - это экземпляр NSString. Его можно использовать для свертывания смежных пробелов в один пробел, передавая [NSCharacterSet whitespaceAndNewlineCharacterSet] и ' ' двум аргументам.

- (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;
}
0 голосов
/ 17 ноября 2013

Вы также можете использовать простой аргумент while. Здесь нет магии RegEx, так что, возможно, в будущем ее будет легче понять и изменить:

while([yourNSStringObject replaceOccurrencesOfString:@"  "
                         withString:@" "
                         options:0
                         range:NSMakeRange(0, [yourNSStringObject length])] > 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...