2012-01-15 4 views
3

Мне нужно разбить фразу на слова, цифры, знаки препинания и пробелы/вкладки. Я также хотел бы сохранить порядок вещей.Разделить текст на слова, цифры и знаки препинания

NSString *text = [NSString stringWithFormat:@"The 3 quick:\"brown fox, jump's\" over."]; 

Это вид списка Мне нужно, чтобы получить:

['The', ' ', '3', ' ', 'quick, ':', '"', 'brown', ' ', 'fox', ',', ' ', 'jump's', ' ', '.'] 

Спасибо !!

+2

Откуда у вас место между «быстрым» и «:»? –

+1

Должны ли сохраняться или разделяться всезначные строки? Другими словами, '' 333 quick' становится '[" The "," "," 333 "," "," quick "] или' ["The", "", "3", "3" , "3", "", "быстрый"] '? – dasblinkenlight

+0

Цифры должны быть сохранены. «333» останется 333. –

ответ

2

Попробуйте эту категорию я написал с помощью NSScanner & NSCharacterSet:

@interface NSString(Splitting) 

-(NSArray *) arrayBySeparatingComponentsInCharacterSet:(NSCharacterSet *) charSet; 

@end 

@implementation NSString(Splitting) 

BOOL scanOneCharacterFromSetIntoString(NSScanner *self, NSCharacterSet * charSet, NSString **outStr); 
BOOL scanOneCharacterFromSetIntoString(NSScanner *self, NSCharacterSet * charSet, NSString **outStr) 
{ 
    // check for index out of bounds 
    NSString *inStr = self.string; 

    if (self.scanLocation >= inStr.length) 
    { 
     return NO; 
    } 

    unichar ch = [inStr characterAtIndex:self.scanLocation]; 

    if (![charSet characterIsMember:ch]) 
    { 
     return NO; 
    } 

    self.scanLocation++; 
    if (outStr) 
    { 
     *outStr = [NSString stringWithCharacters:&ch length:1]; 
    } 

    return YES; 
} 

-(NSArray *) arrayBySeparatingComponentsInCharacterSet:(NSCharacterSet *)charSet 
{ 
    NSScanner *scanner = [NSScanner scannerWithString:self]; 
    NSMutableArray *result = [NSMutableArray array]; 

    NSString *temp = nil; 
    while ([scanner scanUpToCharactersFromSet:charSet intoString:&temp] || scanOneCharacterFromSetIntoString(scanner, charSet, &temp)) {; 
     [result addObject:temp]; 

     if ([scanner scanLocation] >= [self length]) 
     { 
      break; 
     } 

     unichar temp2 = [self characterAtIndex:[scanner scanLocation]]; 

     if ([charSet characterIsMember:temp2]) 
     { 
      [result addObject:[NSString stringWithFormat:@"%c", temp2]]; 
      // only update the scan location if the scan was sucessful 
      [scanner setScanLocation:[scanner scanLocation] + 1]; 
     } 
    } 

    return result; 
} 

@end 

int main (int argc, const char * argv[]) 
{ 
    @autoreleasepool { 

     NSString *str = @"The 3 quick:\"brown fox, jump's\" over."; 
     NSArray *array = [str arrayBySeparatingComponentsInCharacterSet:[NSCharacterSet characterSetWithCharactersInString:@" :\",'."]]; 
     NSLog(@"%@", array); 
    } 
} 

Должно быть то, что вам нужно, просто изменить набор символов на то, что вам нужно. Также обратите внимание, что это было скомпилировано с включенным ARC, поэтому оно может работать или не работать должным образом с управлением памятью в среде с подсчетом ссылок.

+0

Спасибо! Он работал чудесно. Вы избавили меня от множества разочарований, не говоря уже о времени. –

+1

Эй, без проблем, просто рад помочь. –

+0

Одна проблема: NSString * str = @ "hello world ..."; Более одного символа пунктуации в конце предложения вызывает сбой. Также любые идеи, как обращаться с многоточием (три точки «...»)? –

Смежные вопросы