Последовательности коллапса пробела в отдельный символ и строку для обрезки

Отвечая на мой собственный вопрос: я до сих пор не знаю, в чем причина проблемы. Но перекомпиляция исходного кода решила проблему для меня.

122
задан hfossli 8 February 2016 в 15:36
поделиться

7 ответов

Вот фрагмент из расширения 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;
}
3
ответ дан 24 November 2019 в 01:23
поделиться

Другой опция для regex - RegexKitLite , которую очень легко встроить в проект iPhone:

[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
4
ответ дан 24 November 2019 в 01:23
поделиться

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

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
ответ дан 24 November 2019 в 01:23
поделиться

Альтернативное решение: получить себе копию OgreKit (библиотека регулярных выражений Какао).

  • OgreKit (Японская веб-страница - код на английском)
  • OgreKit (Google автоматический перевод):

Тогда вся функция будет следующей:

NSString *theStringTrimmed =
   [theString stringByTrimmingCharactersInSet:
        [NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression  *regex =
    [OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);

Короткая и приятная.

Если вы ищите самое быстрое решение, тщательно сработанная серия инструкций с использованием NSScanner , вероятно, будет работать лучше, но это будет необходимо, только если вы планируете обрабатывать огромные (много мегабайт) блоки текста.

-1
ответ дан 24 November 2019 в 01:23
поделиться

OS X 10.7+ и iOS 3.2+

Используйте собственное решение regexp , предоставленное hfossli.

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

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

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
ответ дан 24 November 2019 в 01:23
поделиться

Предположительно, первый вызов проходит все элементы в итератор (т.е. вызывает next (), пока valid () не станет ложным).

41
ответ дан 24 November 2019 в 01:23
поделиться

Однострочное решение:

NSString *whitespaceString = @" String with whitespaces ";

NSString *trimmedString = [whitespaceString
        stringByReplacingOccurrencesOfString:@" " withString:@""];
9
ответ дан 24 November 2019 в 01:23
поделиться