如何从Objective-C中的NSString获取前N个单词?

时间:2009-11-18 00:57:17

标签: objective-c string nsstring

给出一个字符串,最简单的方法是什么:

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

导致带有第一个 N (例如10个)单词的NSString?

编辑:如果str短于N,我还要确保它不会失败。

4 个答案:

答案 0 :(得分:33)

虽然Barry Wark的代码适用于英语,但它不是检测单词分词的首选方法。许多语言(例如中文和日文)不使用空格分隔单词。例如,德国人有许多难以正确分离的化合物。

您要使用的是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);

答案 1 :(得分:30)

如果单词是以空格分隔的:

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:@" "];

答案 2 :(得分:7)

根据Barry的回答,我为了这个页面写了一个函数(仍然在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:@" "];
}

答案 3 :(得分:2)

这是我的解决方案,源自此处给出的答案,我自己的问题是从字符串中删除第一个单词...

NSMutableArray *words = [NSMutableArray arrayWithArray:[lowerString componentsSeparatedByString:@" "]];
[words removeObjectAtIndex:0];
return [words componentsJoinedByString:@" "];