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

如何从Objective-C中的NSString中获取前N个单词?,objective-c,string,nsstring,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,我还要确保它不会失败。如果单词是空格分隔的: NSInteger nWords = 10; NSRange wordRange = NSMakeRange(0, nW

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

NSString *str = @"Some really really long string is here and I just want the first 10 words, for example";
是否生成包含前N个(例如10个)单词的NSString


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

如果单词是空格分隔的:

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];
那么


虽然巴里·沃克的代码对英语很有效,但它并不是检测单词断裂的首选方法。许多语言,如汉语和日语,不使用空格分隔单词。例如,德国有许多化合物很难正确分离

您想要使用的是:

CFStringRef string;//从某处弄到绳子
CFLocaleRef locale=CFLocaleCopyCurrent();
CFStringTokenizerRef标记化器=CFStringTokenizerCreate(kCFAllocatorDefault,字符串,CFRangeMake(0,CFStringGetLength(字符串)),kCFStringTokenizerUnitWord,区域设置);
CFStringTokenizerTokenType=KCFStringTokenizerTokenOne;
未签名标记查找=0,desiredTokens=10;//或所需的令牌数
而(kcfStringTokenizerTokenOne!=(tokenType=CFStringTokenizerAdvanceToNextToken(tokenizer))&&tokensFound
基于Barry的回答,我为这一页编写了一个函数(在这一点上仍然给予他信任)

+(NSString*)第一个字:(NSString*)第一个字有多少个:(NSInteger)最大字{
NSArray*单词=[字符串分隔的STR组件:@”“;
如果([theWords count]
这是我的解决方案,来源于这里给出的答案,用于解决我自己从字符串中删除第一个单词的问题

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

你赢了我:+1。不要忘记组件joinedbystring:因为OP正在查找NSString结果:)如果字符串只有3个单词,这是否有效?什么是单词索引?(在第一个示例中它似乎未使用)如果只有三个单词,则必须更改nWords。当然,在决定使用nWords之前,您可以找到componentsSeparatedByString并对其进行计数,但您在问题中没有提到这一点。现在,这是一项要求:),因为这将对从web服务加载的许多字符串执行。所以最简单的方法是使用某种MIN函数来设置NWORD?在我看来,你可以随意确定NWORD。。。这只是一个用于说明的变量。如果您决定nWords应该是检索到的以空格分隔的单词的某个百分比,而不是文字数字10,那么只需将[[str componentsSeparatedByString:@”“]count]乘以该百分比即可。@sbooth如果我的字符串以@开头会怎么样。。。让我们这样说:
@sbooth你好吗
。我如何使用标记器来查找类似[“@sbooth”、“How”、“are”、“you”]?@Georg我认为
CFStringTokenizer
本机不支持这种类型的标记化。对于类似用户名检测的内容,您可以检查用户名说明符(@)的返回标记,并将其附加到随后的标记中。或者,如果用户名允许的字符集定义良好,则可以使用regexp。
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);
+ (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:@" "];
}
NSMutableArray *words = [NSMutableArray arrayWithArray:[lowerString componentsSeparatedByString:@" "]];
[words removeObjectAtIndex:0];
return [words componentsJoinedByString:@" "];