En PHP je peux le faire:
$new = str_replace(array('/', ':', '.'), '', $new);
... pour remplacer toutes les instances des caractères /:. avec une chaîne vierge (pour les supprimer)
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
Une façon quelque 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 faire cela un peu plus efficacement.
Il y a des situations où votre méthode est assez bonne je pense que mate .. 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 qui pourrait provoquer une fuite de mémoire.
J'ai dû le faire récemment et je voulais partager une méthode efficace:
(en supposant que someText soit un NSString ou un attribut de texte)
NSString* someText = @"1232342jfahadfskdasfkjvas12!";
(cet exemple supprime les nombres d'une chaîne)
[someText stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [someText length])];
Gardez à l'esprit que vous devrez échapper les caractères littéraux d'expression régulière à l'aide du caractère d'échappement Obj-c:
(obj-c utilise une double barre oblique inverse pour échapper aux littéraux d'expressions spéciales)
...stringByReplacingOccurrencesOfString:@"[\\\!\\.:\\/]"
Ce qui rend cela 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 tutoriel sur les regex iOS Nice 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"), vous pouvez faire ce qui suit:
NSString *s = @"A567B$%C^.123456abcdefg";
NSCharacterSet *doNotWant = [[NSCharacterSet characterSetWithCharactersInString:@"ABCabc123"] invertedSet];
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""];
NSLog(@"%@", s); // => ABC123abc
Utile pour supprimer les symboles et autres, si vous ne voulez que des caractères alphanumériques.
+ (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;
}
Si les caractères que vous souhaitez supprimer devaient être adjacents, vous pouvez utiliser le
stringByReplacingCharactersInRange:(NSRange) withString:(NSString *)
En dehors de cela, je pense que le simple fait d'utiliser la même fonction plusieurs fois n'est pas si mal. C'est beaucoup plus lisible que de créer une grande méthode pour faire de même de manière plus générique.
Créer une extension sur String ...
extension String {
func replacingOccurrences(of strings:[String], with replacement:String) -> String {
var newString = self
for string in strings {
newString = newString.replacingOccurrences(of: string, with: replacement)
}
return newString
}
}
Appelez ça comme ceci:
aString = aString.replacingOccurrences(of:['/', ':', '.'], with:"")
Voici un exemple dans Swift 3 utilisant l'option regularExpression de replaceOccurances.
Utilisez replaceOccurrences avec l'option String.CompareOptions.regularExpression.
Exemple (Swift 3):
var x = "<Hello, [play^ground+]>"
let y = x.replacingOccurrences(of: "[\\[\\]^+<>]", with: "7", options: .regularExpression, range: nil)
print(y)
Sortie:
7Hello, 7play7ground777