Отвечая на мой собственный вопрос: я до сих пор не знаю, в чем причина проблемы. Но перекомпиляция исходного кода решила проблему для меня.
Вот фрагмент из расширения 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;
}
Другой опция для regex - RegexKitLite , которую очень легко встроить в проект iPhone:
[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
Это должно сделать это ...
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:@" "];
Альтернативное решение: получить себе копию OgreKit (библиотека регулярных выражений Какао).
Тогда вся функция будет следующей:
NSString *theStringTrimmed =
[theString stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression *regex =
[OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);
Короткая и приятная.
Если вы ищите самое быстрое решение, тщательно сработанная серия инструкций с использованием NSScanner
, вероятно, будет работать лучше, но это будет необходимо, только если вы планируете обрабатывать огромные (много мегабайт) блоки текста.
Используйте собственное решение 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:@" "];
Предположительно, первый вызов проходит все элементы в итератор (т.е. вызывает next (), пока valid () не станет ложным).
Однострочное решение:
NSString *whitespaceString = @" String with whitespaces ";
NSString *trimmedString = [whitespaceString
stringByReplacingOccurrencesOfString:@" " withString:@""];