2013-03-12 5 views
1

Как удалить первое N количество слов из NSString?iOS удаление первых N слов из NSString

Например, «Я пошел в магазин, чтобы купить молоко». Я хочу удалить первые три слова, чтобы сделать это ...

«Магазин, чтобы купить молоко». (обратите внимание, что перед словом «the» нет пробела).

Спасибо!

ответ

3

Этот вопрос можно перефразировать как «как я могу получить подстроку, начинающуюся с 4-го слова в строке?», Что немного легче решить. Я также предполагаю, что строки с менее чем 4 словами должны стать пустыми.

В любом случае рабочая лошадка здесь -enumerateSubstringsInRange:options:usingBlock:, которую мы можем использовать для поиска 4-го слова.

NSString *substringFromFourthWord(NSString *input) { 
    __block NSUInteger index = NSNotFound; 
    __block NSUInteger count = 0; 
    [input enumerateSubstringsInRange:NSMakeRange(0, [input length]) options:(NSStringEnumerationByWords|NSStringEnumerationSubstringNotRequired) usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
     if (++count == 4) { 
      // found the 4th word 
      index = substringRange.location; 
      *stop = YES; 
     } 
    }]; 
    if (index == NSNotFound) { 
     return @""; 
    } else { 
     return [input substringFromIndex:index]; 
    } 
} 

Как это работает, мы просим -enumerateSubstrings... перечислить словами. Когда мы находим 4-е слово, мы сохраняем его исходное местоположение и выходим из цикла. Теперь, когда у нас есть начало 4-го слова, мы можем просто получить подстроку из этого индекса. Если мы не получили 4 слова, мы возвращаем @"".

1

Лучшие ответы здесь: How to get the first N words from a NSString in Objective-C?

Вам просто нужно изменить диапазон.

+0

Это фактически перевернутый вопрос. Принятый ответ там также не является локальным. Он работает только для языков, которые ограничивают слова, используя пробелы. И второй ответ: а) использует более сложный API, чем мы можем теперь использовать в 'NSString', и b) предполагает, что текущая локаль - это локаль строки, тогда как I * полагает * поведение по умолчанию' -enumerateSubstrings ... 'определяет локаль из текста. –

0

Off верхней части моей головы, а не так гладко, как решение Кевина Балларда:

NSString *phrase = @"I went to the store to buy milk."; 

NSMutableString *words = [[NSMutableString alloc] init]; 
NSArray *words = [phrase componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 

NSMutableIndexSet *indexes = [NSMutableIndexSet indexSetWithIndex:1]; 
[indexes addIndex:2]; 
[indexes addIndex:3]; 
[words removeObjectsAtIndexes:indexes]; 

NSString *output = [words componentsJoinedByString:@" "]; 

Мой код не будет работать на языках, которые не используют пробелы между словами (например, мандарина и некоторых других дальневосточных языков) ,

1

Решение №1: просто сделайте это так, как вы это сделаете вручную: пропустите первые n пробелов.

NSString *cutToNthWord(NSString *orig, NSInteger idx) 
{ 
    NSRange r = NSMakeRange(0, 0); 
    for (NSInteger i = 0; i < idx; i++) { 
     r = [orig rangeOfString:@" " 
         options:kNilOptions 
          range:NSMakeRange(NSMaxRange(r), orig.length - NSMaxRange(r))]; 
    } 
    return [orig substringFromIndex:NSMaxRange(r)]; 
} 

Решение # 2 (очиститель): разбить строку на пространствах, присоединиться к последнему n - k элемент результирующего массива, где k является количество пропускаемых слов, n это общее количество слов:

NSString *cutToNthWord(NSString *orig, NSInteger idx) 
{ 
    NSArray *comps = [orig componentsSeparatedByString:@" "]; 
    NSArray *sub = [comps subarrayWithRange:NSMakeRange(idx, comps.count - idx)]; 
    return [sub componentsJoinedByString:@" "]; 
} 
Смежные вопросы