48 votes

Remplacer plusieurs caractères d'une chaîne dans Objective-C?

En PHP, je peux faire ceci:

 $new = str_replace(array('/', ':', '.'), '', $new);
 

... pour remplacer toutes les occurrences des caractères /:. avec une chaîne vide (pour les enlever)

Puis-je le faire facilement dans Objective-C? Ou dois-je rouler le mien?

Actuellement, je fais plusieurs appels à stringByReplacingOccurrencesOfString :

 strNew = [strNew stringByReplacingOccurrencesOfString:@"/" withString:@""];
strNew = [strNew stringByReplacingOccurrencesOfString:@":" withString:@""];
strNew = [strNew stringByReplacingOccurrencesOfString:@"." withString:@""];
 

Merci,
mat

122voto

Nicholas Riley Points 26161

Une façon un peu inefficace de le faire:

 NSString *s = @"foo/bar:baz.foo";
NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"/:."];
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""];
NSLog(@"%@", s); // => foobarbazfoo
 

Regardez NSScanner et -[NSString rangeOfCharacterFromSet: ...] si vous voulez le faire un peu plus efficacement.

27voto

nikkumang Points 838

Il y a des situations où votre méthode est suffisamment bonne, je pense que c'est bon, BTW, je pense que c'est mieux d'utiliser

 [strNew setString: [strNew stringByReplacingOccurrencesOfString:@":" withString:@""]];
 

plutôt que

 strNew = [strNew stringByReplacingOccurrencesOfString:@"/" withString:@""];
 

car je pense que vous écrasez un pointeur NSMutableString avec un NSString, ce qui pourrait provoquer une fuite de mémoire.

6voto

Stonz2 Points 2151

Il s'agit essentiellement de la même chose que Nicholas publiée ci-dessus, mais si vous souhaitez tout supprimer SAUF un ensemble de caractères (par exemple, vous souhaitez supprimer tout ce qui n'est pas dans l'ensemble "ABCabc123"), vous pouvez procéder comme suit:

 NSString *s = @"A567B$%C^.123456abcdefg";
NSCharacterSet *doNotWant = [[NSCharacterSet characterSetWithCharactersInString:@"ABCabc123"] invertedSet];
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""];
NSLog(@"%@", s); // => ABC123abc
 

Utile pour éliminer les symboles et autres, si vous voulez seulement des caractères alphanumériques.

2voto

Krishna Gupta Points 39
+ (NSString*) decodeHtmlUnicodeCharactersToString:(NSString*)str
{
    NSMutableString* string = [[NSMutableString alloc] initWithString:str];  // #&39; replace with '
    NSString* unicodeStr = nil;
    NSString* replaceStr = nil;
    int counter = -1;

    for(int i = 0; i < [string length]; ++i)
    {
        unichar char1 = [string characterAtIndex:i]; 
        for (int k = i + 1; k < [string length] - 1; ++k)
        {
            unichar char2 = [string characterAtIndex:k]; 

            if (char1 == '&'  && char2 == '#' ) 
            { 
                ++counter;
                unicodeStr = [string substringWithRange:NSMakeRange(i + 2 , 2)]; // read integer value i.e, 39
                replaceStr = [string substringWithRange:NSMakeRange (i, 5)];  // #&39;
                [string replaceCharactersInRange: [string rangeOfString:replaceStr] withString:[NSString stringWithFormat:@"%c",[unicodeStr intValue]]];
                break;
            }
        }
    }

    [string autorelease];

    if (counter > 1)
        return [self decodeHtmlUnicodeCharactersToString:string]; 
    else
        return string;
}

1voto

Gerard Points 493

Si les personnages que vous souhaitez supprimer doivent être adjacents, vous pouvez utiliser le

 stringByReplacingCharactersInRange:(NSRange) withString:(NSString *)
 

Autre que cela, je pense qu'utiliser la même fonction plusieurs fois n'est pas si grave. C'est beaucoup plus lisible que de créer une grande méthode pour faire la même chose d'une manière plus générique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X