Remplacez plusieurs caractères dans une chaîne dans Objective-C?

En PHP, je peux le faire:

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

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

Puis-je le faire facilement dans Objective-C? Ou dois-je rouler moi-même?

Actuellement, je fais plusieurs appels à ssortingngByReplacingOccurrencesOfSsortingng :

 strNew = [strNew ssortingngByReplacingOccurrencesOfSsortingng:@"/" withSsortingng:@""]; strNew = [strNew ssortingngByReplacingOccurrencesOfSsortingng:@":" withSsortingng:@""]; strNew = [strNew ssortingngByReplacingOccurrencesOfSsortingng:@"." withSsortingng:@""]; 

Merci,
mat

Un moyen peu efficace de le faire:

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

Regardez NSScanner et -[NSSsortingng rangeOfCharacterFromSet: ...] si vous voulez faire cela plus efficacement.

Il y a des situations où votre méthode est assez bonne, je pense que mate .. BTW, je pense qu’il vaut mieux utiliser

 [strNew setSsortingng: [strNew ssortingngByReplacingOccurrencesOfSsortingng:@":" withSsortingng:@""]]; 

plutôt que

 strNew = [strNew ssortingngByReplacingOccurrencesOfSsortingng:@"/" withSsortingng:@""]; 

comme je pense que vous écrasez un pointeur NSMutableSsortingng avec un NSSsortingng qui pourrait provoquer une fuite de mémoire.

A dû le faire récemment et souhaitait partager une méthode efficace:

(en supposant que someText est un atsortingbut NSSsortingng ou text)

 NSSsortingng* someText = @"1232342jfahadfskdasfkjvas12!"; 

(cet exemple dépouillera les numéros d’une chaîne)

 [someText ssortingngByReplacingOccurrencesOfSsortingng:@"[^0-9]" withSsortingng:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [someText length])]; 

Gardez à l’esprit que vous devrez échapper les caractères littéraux de regex en utilisant le caractère d’échappement Obj-c:

(obj-c utilise une double barre oblique inverse pour échapper aux littéraux de regex spéciaux)

 ...ssortingngByReplacingOccurrencesOfSsortingng:@"[\\\!\\.:\\/]" 

Ce qui est intéressant, c’est que l’option NSRegularExpressionSearch est peu utilisée mais peut conduire à des contrôles très puissants:

Vous pouvez trouver un bon tutoriel iOS regex ici et plus sur les expressions régulières sur regex101.com

Essentiellement la même chose que Nicholas a posté ci-dessus, mais si vous voulez tout supprimer SAUF un ensemble de caractères (disons que vous voulez supprimer tout ce qui n’est pas dans l’ensemble “ABCabc123”) alors vous pouvez faire ce qui suit:

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

Utile pour enlever les symboles et autres, si vous ne voulez que des caractères alphanumériques.

 + (NSSsortingng*) decodeHtmlUnicodeCharactersToSsortingng:(NSSsortingng*)str { NSMutableSsortingng* ssortingng = [[NSMutableSsortingng alloc] initWithSsortingng:str]; // #&39; replace with ' NSSsortingng* unicodeStr = nil; NSSsortingng* 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 ie, 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 decodeHtmlUnicodeCharactersToSsortingng:ssortingng]; else return ssortingng; } 

Si les caractères que vous souhaitez supprimer étaient adjacents, vous pouvez utiliser le

 ssortingngByReplacingCharactersInRange:(NSRange) withSsortingng:(NSSsortingng *) 

En dehors de cela, je pense que le fait d’utiliser plusieurs fois la même fonction n’est pas si grave. Il est beaucoup plus lisible que de créer une grande méthode pour faire la même chose de manière plus générique.

Voici un exemple dans Swift 3 utilisant l’option regularExpression pour remplacer les assurances.

Utilisez replaceOccurrences avec une option Ssortingng.CompareOptions.regularExpression .

Exemple (Swift 3):

 var x = "" let y = x.replacingOccurrences(of: "[\\[\\]^+<>]", with: "7", options: .regularExpression, range: nil) print(y) 

Sortie:

 7Hello, 7play7ground777 

Créer une extension sur Ssortingng …

 extension Ssortingng { func replacingOccurrences(of ssortingngs:[Ssortingng], with replacement:Ssortingng) -> Ssortingng { var newSsortingng = self for ssortingng in ssortingngs { newSsortingng = newSsortingng.replacingOccurrences(of: ssortingng, with: replacement) } return newSsortingng } } 

Appelez-le comme ceci:

 aSsortingng = aSsortingng.replacingOccurrences(of:['/', ':', '.'], with:"")