В то время как код Барри Уорка хорошо работает для английского языка, это не лучший способ обнаружить разрывы слов. Многие языки, такие как китайский и японский, не разделяют слова, используя пробелы. У немецкого языка, например, есть много соединений, которые трудно отделить.
То, что вы хотите использовать 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. Не забывайте о компонентахJoinedByString: поскольку OP искал результат NSString :) –
Это работает, если строка содержит только 3 слова? Что такое wordIndexes? (он не используется в первом примере) – philfreo
Вам нужно будет изменить nWords, если есть только три слова. Вы могли бы, конечно, найти компонентыSeparatedByString и посчитать их, прежде чем принимать решение о nWords, но вы не упомянули об этом в качестве требования в своем вопросе. –