NSString - Convert to pure alphabet only (i.e. remove accents+punctuation)

前端 未结 13 1465
暖寄归人
暖寄归人 2020-12-02 15:49

I\'m trying to compare names without any punctuation, spaces, accents etc. At the moment I am doing the following:

-(NSString*) prepareString:(NSString*)a {
         


        
13条回答
  •  鱼传尺愫
    2020-12-02 16:18

    I wanted to filter out everything except letters and numbers, so I adapted Lorean's implementation of a Category on NSString to work a little different. In this example, you specify a string with only the characters you want to keep, and everything else is filtered out:

    @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
    

    Once you've made your Categories, using them is trivial, and you can use them on any NSString:

    NSString *string = someStringValueThatYouWantToFilter;
    
    string = [string stringByKeepingOnlyLettersAndNumbers];
    

    Or, for example, if you wanted to get rid of everything except vowels:

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

    If you're still learning Objective-C and aren't using Categories, I encourage you to try them out. They're the best place to put things like this because it gives more functionality to all objects of the class you Categorize.

    Categories simplify and encapsulate the code you're adding, making it easy to reuse on all of your projects. It's a great feature of Objective-C!

提交回复
热议问题