2009-11-18 33 views

Trả lời

30

Nếu lời là không gian tách biệt:

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

nếu muốn phá vỡ trên tất cả các khoảng trắng:

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

Sau đó,

NSString *result = [firstWords componentsJoinedByString:@" "]; 
+0

Bạn đánh tôi với nó: +1. Đừng quên componentsJoinedByString: vì OP đang tìm kiếm kết quả NSString :) –

+0

Điều này có hiệu quả nếu chuỗi chỉ có 3 từ? WordIndex là gì? (nó xuất hiện không được sử dụng trong ví dụ đầu tiên) – philfreo

+0

Bạn sẽ phải thay đổi nWords nếu chỉ có ba từ. Tất nhiên, bạn có thể tìm các thành phầnSeparatedByString và đếm chúng trước khi quyết định về nWords, nhưng bạn không đề cập đến điều đó như là một yêu cầu trong câu hỏi của bạn. –

32

Trong khi mã của Barry Wark hoạt động tốt cho tiếng Anh, nó không phải là cách ưu tiên để phát hiện các ngắt từ. Nhiều ngôn ngữ, chẳng hạn như tiếng Trung và tiếng Nhật, không tách biệt các từ bằng cách sử dụng dấu cách. Và Đức, ví dụ, có nhiều hợp chất khó phân tách một cách chính xác.

gì bạn muốn sử dụng là 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

Vâng, tốt! Tôi nên suy nghĩ ngoài miền địa phương của tôi. –

+0

Cảm ơn bạn đã cho ví dụ tốt! – pnmn

+0

@sbooth Điều gì nếu chuỗi của tôi bắt đầu bằng @ ... hãy nói như nhận xét này: '@sbooth bạn thế nào'. Làm cách nào tôi có thể sử dụng trình mã thông báo để tìm thứ gì đó như ["@sbooth", "how", "are", "you"]? – Georg

7

Dựa trên câu trả lời của Barry, tôi đã viết một chức năng vì lợi ích của trang này (vẫn cho anh ta tín dụng trên 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

Dưới đây là giải pháp của tôi, bắt nguồn từ câu trả lời được đưa ra ở đây, cho vấn đề của riêng tôi khi xóa từ đầu tiên khỏi một chuỗi ...

NSMutableArray *words = [NSMutableArray arrayWithArray:[lowerString componentsSeparatedByString:@" "]]; 
[words removeObjectAtIndex:0]; 
return [words componentsJoinedByString:@" "]; 
Các vấn đề liên quan