Как получить первые N слов из строки NSSt в Objective-C? - PullRequest
9 голосов
/ 18 ноября 2009

Какой самый простой способ для строки:

NSString *str = @"Some really really long string is here and I just want the first 10 words, for example";

, чтобы получить строку NSS с первыми N (например, 10) словами?

РЕДАКТИРОВАТЬ: Я также хотел бы убедиться, что он не потерпит неудачу, если str короче, чем N.

Ответы [ 4 ]

33 голосов
/ 18 ноября 2009

Хотя код Барри Уорка хорошо работает для английского языка, он не является предпочтительным способом обнаружения разрывов слов. Многие языки, такие как китайский и японский, не разделяют слова, используя пробелы. А в Германии, например, есть много соединений, которые трудно правильно разделить.

То, что вы хотите использовать, это CFStringTokenizer :

CFStringRef string; // Get string from somewhere
CFLocaleRef locale = CFLocaleCopyCurrent();

CFStringTokenizerRef tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, string, CFRangeMake(0, CFStringGetLength(string)), kCFStringTokenizerUnitWord, locale);

CFStringTokenizerTokenType tokenType = kCFStringTokenizerTokenNone;
unsigned tokensFound = 0, desiredTokens = 10; // or the desired number of tokens

while(kCFStringTokenizerTokenNone != (tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)) && tokensFound < desiredTokens) {
  CFRange tokenRange = CFStringTokenizerGetCurrentTokenRange(tokenizer);
  CFStringRef tokenValue = CFStringCreateWithSubstring(kCFAllocatorDefault, string, tokenRange);

  // Do something with the token
  CFShow(tokenValue);

  CFRelease(tokenValue);

  ++tokensFound;
}

// Clean up
CFRelease(tokenizer);
CFRelease(locale);
30 голосов
/ 18 ноября 2009

Если слова разделены пробелом:

NSInteger nWords = 10;
NSRange wordRange = NSMakeRange(0, nWords);
NSArray *firstWords = [[str componentsSeparatedByString:@" "] subarrayWithRange:wordRange];

, если вы хотите разбить все пробелы:

NSCharacterSet *delimiterCharacterSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];
NSArray *firstWords = [[str componentsSeparatedByCharactersInSet:delimiterCharacterSet] subarrayWithRange:wordRange];

Тогда

NSString *result = [firstWords componentsJoinedByString:@" "];
7 голосов
/ 18 ноября 2009

Основываясь на ответе Барри, я написал функцию для этой страницы (все еще отдавая ему должное в SO)

+ (NSString*)firstWords:(NSString*)theStr howMany:(NSInteger)maxWords {

    NSArray *theWords = [theStr componentsSeparatedByString:@" "];
    if ([theWords count] < maxWords) {
        maxWords = [theWords count];
    }
    NSRange wordRange = NSMakeRange(0, maxWords - 1);
    NSArray *firstWords = [theWords subarrayWithRange:wordRange];       
    return [firstWords componentsJoinedByString:@" "];
}
2 голосов
/ 15 октября 2012

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

NSMutableArray *words = [NSMutableArray arrayWithArray:[lowerString componentsSeparatedByString:@" "]];
[words removeObjectAtIndex:0];
return [words componentsJoinedByString:@" "];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...