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