NSString - конвертировать только в чистый алфавит (т.е. удалять акценты + пунктуацию) - PullRequest
26 голосов
/ 05 августа 2009

Я пытаюсь сравнить имена без знаков препинания, пробелов, ударений и т. Д. На данный момент я делаю следующее:

-(NSString*) prepareString:(NSString*)a {
    //remove any accents and punctuation;
    a=[[[NSString alloc] initWithData:[a dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding] autorelease];

    a=[a stringByReplacingOccurrencesOfString:@" " withString:@""];
    a=[a stringByReplacingOccurrencesOfString:@"'" withString:@""];
    a=[a stringByReplacingOccurrencesOfString:@"`" withString:@""];
    a=[a stringByReplacingOccurrencesOfString:@"-" withString:@""];
    a=[a stringByReplacingOccurrencesOfString:@"_" withString:@""];
    a=[a lowercaseString];
    return a;
}

Однако мне нужно сделать это для сотен строк, и мне нужно сделать это более эффективным. Есть идеи?

Ответы [ 13 ]

1 голос
/ 19 ноября 2012
@interface NSString (Filtering)
    - (NSString*)stringByFilteringCharacters:(NSCharacterSet*)charSet;
@end

@implementation NSString (Filtering)
    - (NSString*)stringByFilteringCharacters:(NSCharacterSet*)charSet {
      NSMutableString * mutString = [NSMutableString stringWithCapacity:[self length]];
      for (int i = 0; i < [self length]; i++){
        char c = [self characterAtIndex:i];
        if(![charSet characterIsMember:c]) [mutString appendFormat:@"%c", c];
      }
      return [NSString stringWithString:mutString];
    }
@end
0 голосов
/ 27 марта 2016

Решение Питера в Swift:

let newString = oldString.componentsSeparatedByCharactersInSet(NSCharacterSet.letterCharacterSet().invertedSet).joinWithSeparator("")

Пример:

let oldString = "Jo_ - h !. nn y"
// "Jo_ - h !. nn y"
oldString.componentsSeparatedByCharactersInSet(NSCharacterSet.letterCharacterSet().invertedSet)
// ["Jo", "h", "nn", "y"]
oldString.componentsSeparatedByCharactersInSet(NSCharacterSet.letterCharacterSet().invertedSet).joinWithSeparator("")
// "Johnny"
0 голосов
/ 10 января 2015

Я хотел отфильтровать все, кроме букв и цифр, поэтому я адаптировал реализацию категории Lorean для категории NSString, чтобы она работала немного иначе. В этом примере вы указываете строку, содержащую только те символы, которые хотите сохранить, а все остальное отфильтровывается:

@interface NSString (PraxCategories)
+ (NSString *)lettersAndNumbers;
- (NSString*)stringByKeepingOnlyLettersAndNumbers;
- (NSString*)stringByKeepingOnlyCharactersInString:(NSString *)string;
@end


@implementation NSString (PraxCategories)

+ (NSString *)lettersAndNumbers { return @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; }

- (NSString*)stringByKeepingOnlyLettersAndNumbers {
    return [self stringByKeepingOnlyCharactersInString:[NSString lettersAndNumbers]];
}

- (NSString*)stringByKeepingOnlyCharactersInString:(NSString *)string {
    NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:string];
    NSMutableString * mutableString = @"".mutableCopy;
    for (int i = 0; i < [self length]; i++){
        char character = [self characterAtIndex:i];
        if([characterSet characterIsMember:character]) [mutableString appendFormat:@"%c", character];
    }
    return mutableString.copy;
}

@end

Как только вы создали свои категории, их использование становится тривиальным, и вы можете использовать их в любой NSString:

NSString *string = someStringValueThatYouWantToFilter;

string = [string stringByKeepingOnlyLettersAndNumbers];

Или, например, если вы хотите избавиться от всего, кроме гласных:

string = [string stringByKeepingOnlyCharactersInString:@"aeiouAEIOU"];

Если вы все еще изучаете Objective-C и не используете категории, я советую вам попробовать их. Это лучшее место для подобных вещей, потому что оно дает больше функциональности всем объектам класса, который вы классифицируете.

Категории упрощают и инкапсулируют код, который вы добавляете, облегчая повторное использование во всех ваших проектах. Это отличная особенность Objective-C!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...