web-dev-qa-db-fra.com

Remplacer 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 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

48
Matt Sephton

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.

121
Nicholas Riley

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.

27
N. R. Gresham

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

7
Tommie C.

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.

6
Stonz2
+ (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;
}
2
Krishna Gupta

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.

1
Gerard

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:"")
1
Matt Green

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
1
Michael Peterson