2009-11-18 9 views
9

Qual è il modo più semplice, data una stringa:Come ottenere le prime N parole da una NSString in Objective-C?

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

ai risultati in un NSString con le prime N (ad esempio, 10) le parole?

EDIT: Vorrei anche per assicurarsi che non fallisce se il str è più breve di N.

risposta

30

Se le parole sono separate da spazi:

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

se si desidera rompere il tutti gli spazi:

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

Poi,

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

Mi hai battuto sopra: +1. Non dimenticare i componenti JoinedByString: poiché l'OP cercava un risultato NSString :) –

+0

Funziona se la stringa ha solo 3 parole? Che cosa è wordIndexes? (appare inutilizzato nel primo esempio) – philfreo

+0

Dovresti cambiare nWords se ci sono solo tre parole. Ovviamente potresti trovare i componenti SeparatedByString e contarli prima di decidere su nWords, ma non ne hai parlato come requisito nella tua domanda. –

32

Mentre il codice di Barry Wark funziona bene per l'inglese, non è il modo preferito per rilevare interruzioni di parole. Molte lingue, come il cinese e il giapponese, non separano le parole usando spazi. E il tedesco, per esempio, ha molti composti che sono difficili da separare correttamente.

Ciò che si vuole utilizzare è 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

Sì, bene! Dovrei pensare oltre il mio locale. –

+0

Grazie per il buon esempio! – pnmn

+0

@sbooth Cosa succede se la mia stringa inizia con un @ ... diciamo come questo commento: '@sbooth come stai? ' Come posso usare il tokenizer per trovare qualcosa come ["@sbooth", "come", "sono", "tu"]? – Georg

7

in base alla risposta di Barry, ho scritto una funzione per il bene di questa pagina (ancora dandogli credito su 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

Ecco la mia soluzione, derivata dalle risposte date qui, per il mio problema di rimuovere la prima parola da una stringa ...

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