44 votes

Remplacer seulement la première instance d'une sous-chaîne dans une NSString

Donc si vous avez une NSString qui va :

@"My blue car is bigger than my blue shoes or my blue bicycle";

Je voudrais une méthode qui remplace seulement la première instance de bleu par du vert, pour produire :

@"My green car is bigger than my blue shoes or my blue bicycle";

Comment s'y prendre ?

63voto

Jonathan Grynspan Points 32291

En supposant les entrées suivantes :

NSString *myString = @"My blue car is bigger then my blue shoes or my blue bicycle";
NSString *original = @"blue";
NSString *replacement = @"green";

L'algorithme est assez simple :

NSRange rOriginal = [myString rangeOfString:original];

if (NSNotFound != rOriginal.location) {
    myString = [myString stringByReplacingCharactersInRange:rOriginal withString:replacement];
}

27 votes

Une autre passe avec original = @"then" replacement = @"than" pourrait également être conseillée.

3 votes

Ce n'est pas mon problème si la chaîne originale comporte des fautes de frappe. ;p

0 votes

Merci. Vous m'avez vraiment fait gagner du temps :)

24voto

Kevin Sabbe Points 736

SWIFT 3 et 4 UPDATE :

extension String 
{
    func stringByReplacingFirstOccurrenceOfString(
            target: String, withString replaceString: String) -> String
    {
        if let range = self.range(of: target) {
            return self.replacingCharacters(in: range, with: replaceString)
        }
        return self
    } 
}

1 votes

Fonctionne aussi parfaitement dans Swift 4.2

10voto

Daniel Saidi Points 351

Version Swift 4 :

func replacingFirstOccurrence(of string: String, with replacement: String) -> String {
    guard let range = self.range(of: string) else { return self }
    return replacingCharacters(in: range, with: replacement)
}

10voto

Spoek Points 1093

Une version plus Swift des implémentations postées ici. Celle-ci correspond à la syntaxe replacingOccurrences(of:with:) dans Swift 5.1

extension String {

    func replacingFirstOccurrence(of target: String, with replacement: String) -> String {
        guard let range = self.range(of: target) else { return self }
        return self.replacingCharacters(in: range, with: replacement)
    }
}

Un exemple d'utilisation :

let string = "I like bacon, please give me some more bacon!"
let newString = string.replacingFirstOccurrence(of: "bacon", with: "meat")

9voto

Velthune Points 3019

En Swift est utile étend Chaîne de caractères de cette façon :

public extension String {

    func stringByReplacingFirstOccurrenceOfString(target: String, withString replaceString: String) -> String {
        if let range = self.rangeOfString(target) {
            return self.stringByReplacingCharactersInRange(range, withString: replaceString)
        }
        return self
    }

}

De cette façon, vous pouvez appeler n'importe où :

let s = "The red red cat".stringByReplacingFirstOccurrenceOfString("red", withString: "fat")
print(s) // "The fat red cat"

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