代码之家  ›  专栏  ›  技术社区  ›  philfreo

如何从Objective-C中的nsstring中获取前n个单词?

  •  9
  • philfreo  · 技术社区  · 15 年前

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

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

    使用第一个 N号 (例如,10)单词?

    编辑:我还想确保它不会失败,如果 str 小于n。

    4 回复  |  直到 10 年前
        1
  •  30
  •   automaticoo    11 年前

    如果单词是空格分隔的:

    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
  •  33
  •   Marcus Adams    10 年前

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

    你想用的是 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);
    
        3
  •  7
  •   philfreo    15 年前

    基于巴里的回答,我为这一页写了一个函数(仍以此为基础)

    + (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:@" "];
    }
    
        4
  •  2
  •   Pedro    12 年前

    这是我的解决方案,来自于这里给出的答案,对于我自己从字符串中删除第一个单词的问题…

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