Відповіді:
Використовуйте нативний розчин regexp, наданий hfossli.
Або скористайтеся улюбленою бібліотекою regexp або скористайтеся наступним рішенням для какао:
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:@" "];
Тут допоможуть 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+
Простота розширення, продуктивності, рядків номера коду та кількість створених об'єктів робить це рішення відповідним.
stringByReplacingOccurrencesOfString:
. Не можу повірити, що я цього не знав.
Насправді для цього є дуже просте рішення:
NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)
( Джерело )
З регулярним виразом, але без необхідності жодних зовнішніх рамок:
NSString *theString = @" Hello this is a long string! ";
theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, theString.length)];
NSRegularExpressionSearch
говорить, що вона працює лише з rangeOfString:...
методами
Рішення в одну лінію:
NSString *whitespaceString = @" String with whitespaces ";
NSString *trimmedString = [whitespaceString
stringByReplacingOccurrencesOfString:@" " 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:@" "];
Ще один варіант для регулярного вибору - RegexKitLite , який дуже легко вбудувати в проект iPhone:
[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
Ось фрагмент із 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;
}
Альтернативне рішення: придбайте собі копію OgreKit (бібліотеки регулярних виразів какао).
Вся функція тоді:
NSString *theStringTrimmed =
[theString stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression *regex =
[OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);
Короткий і милий.
Якщо ви шукаєте найшвидше рішення, ретельно побудована серія інструкцій з використанням NSScanner
, ймовірно, буде найкраще працювати, але це буде потрібно лише в тому випадку, якщо ви плануєте обробляти величезні (багато мегабайт) текстові блоки.
згідно з @Mathieu Годарт - найкраща відповідь, але якийсь рядок відсутній, усі відповіді просто зменшують пробіл між словами, але коли, якщо у вас є вкладки або є вкладка в просторі, наприклад: "це текст \ t і \ tTab між, так далі "у трьох рядкових кодах ми будемо: рядок, який ми хочемо зменшити пробілами
NSString * str_aLine = @" this is text \t , and\tTab between , so on ";
// replace tabs to space
str_aLine = [str_aLine stringByReplacingOccurrencesOfString:@"\t" withString:@" "];
// reduce spaces to one space
str_aLine = [str_aLine stringByReplacingOccurrencesOfString:@" +" withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, str_aLine.length)];
// trim begin and end from white spaces
str_aLine = [str_aLine stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
результат є
"this is text , and Tab between , so on"
без заміни вкладки результат буде:
"this is text , and Tab between , so on"
Ви також можете використовувати простий аргумент while. У нас немає ніякої магії RegEx, тому, можливо, її легше зрозуміти та змінити в майбутньому:
while([yourNSStringObject replaceOccurrencesOfString:@" "
withString:@" "
options:0
range:NSMakeRange(0, [yourNSStringObject length])] > 0);
Наступні два регулярні вирази діятимуть залежно від вимог
Потім застосуйте метод екземпляра nsstring, stringByReplacingOccurrencesOfString:withString:options:range:
щоб замінити їх єдиним пробілом.
напр
[string stringByReplacingOccurrencesOfString:regex withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])];
Примітка. Я не використовував бібліотеку "RegexKitLite" для вищезазначених функцій для iOS 5.x і вище.