Est-il possible de remplacer des caractères sur Swift String?

474

Je cherche un moyen de remplacer les personnages d'un Swift String.

Exemple: "Ceci est ma chaîne"

Je voudrais remplacer "" par "+" pour obtenir "This + is + my + string".

Comment puis-je atteindre cet objectif?

user3332801
la source
Extension Swift
Juan Boero

Réponses:

912

Cette réponse a été mise à jour pour Swift 4 et 5 . Si vous utilisez toujours Swift 1, 2 ou 3, consultez l'historique des révisions.

Vous avez plusieurs options. Vous pouvez faire comme suggéré par @jaumard et utiliserreplacingOccurrences()

let aString = "This is my string"
let newString = aString.replacingOccurrences(of: " ", with: "+", options: .literal, range: nil)

Et comme indiqué par @cprcrack ci-dessous, les paramètres optionset rangesont facultatifs, donc si vous ne souhaitez pas spécifier d'options de comparaison de chaînes ou d'une plage pour effectuer le remplacement, vous n'avez besoin que des éléments suivants.

let aString = "This is my string"
let newString = aString.replacingOccurrences(of: " ", with: "+")

Ou, si les données sont dans un format spécifique comme celui-ci, où vous remplacez simplement des caractères de séparation, vous pouvez utiliser components()pour diviser la chaîne en un tableau, puis vous pouvez utiliser la join()fonction pour les remettre ensemble avec un séparateur spécifié .

let toArray = aString.components(separatedBy: " ")
let backToString = toArray.joined(separator: "+")

Ou si vous recherchez une solution plus Swifty qui n'utilise pas l'API de NSString, vous pouvez l'utiliser.

let aString = "Some search text"

let replaced = String(aString.map {
    $0 == " " ? "+" : $0
})
Mick MacCallum
la source
9
les options et les paramètres de plage sont facultatifs
cprcrack
1
excellent remplacement swift2 pour stringByReplacingOccurrencesOfString
rjb101
Je ne sais pas si je fais quelque chose de mal mais la deuxième solution swift 2.0 me laisse avec et une chaîne optionnelle. La chaîne d'origine ressemble à ceci: "x86_64"et le nouveau mappage ressemble à"Optional([\"x\", \"8\", \"6\", \"_\", \"6\", \"4\"])"
John Shelley
7
Pour tous ceux qui ont eu des problèmes avec stringByReplacingOccurrencesOfStringSwift 2, vous devez import Foundationpouvoir utiliser cette méthode.
Liron Yahdav
1
wow, stringByReplacingOccurrencesOfString, comme c'est intuitif! Je m'attendais à quelque chose comme makeNewStringByReplacingOccurrencesOfFirstArgumentByValueInSecondArgument
Novellizator
64

Vous pouvez utiliser ceci:

let s = "This is my string"
let modified = s.replace(" ", withString:"+")    

Si vous ajoutez cette méthode d'extension n'importe où dans votre code:

extension String
{
    func replace(target: String, withString: String) -> String
    {
       return self.stringByReplacingOccurrencesOfString(target, withString: withString, options: NSStringCompareOptions.LiteralSearch, range: nil)
    }
}

Swift 3:

extension String
{
    func replace(target: String, withString: String) -> String
    {
        return self.replacingOccurrences(of: target, with: withString, options: NSString.CompareOptions.literal, range: nil)
    }
}
Whitneyland
la source
2
Je ne nommerais pas la fonction "remplacer" car cela suggère qu'elle mute la variable. Utilisez la même grammaire qu'Apple. L'appeler «remplacer (_: withString :)» le rend beaucoup plus clair. Une future fonction de «remplacement» mutante entrerait également en conflit avec la dénomination.
Sunkas
57

Solution Swift 3, Swift 4, Swift 5

let exampleString = "Example string"

//Solution suggested above in Swift 3.0
let stringToArray = exampleString.components(separatedBy: " ")
let stringFromArray = stringToArray.joined(separator: "+")

//Swiftiest solution
let swiftyString = exampleString.replacingOccurrences(of: " ", with: "+")
Ben Sullivan
la source
c'est une réponse à cette question.
Bijender Singh Shekhawat
19

Avez-vous testé ceci:

var test = "This is my string"

let replaced = test.stringByReplacingOccurrencesOfString(" ", withString: "+", options: nil, range: nil)
jaumard
la source
13

Swift 4:

let abc = "Hello world"

let result = abc.replacingOccurrences(of: " ", with: "_", 
    options: NSString.CompareOptions.literal, range:nil)

print(result :\(result))

Production:

result : Hello_world
Manish
la source
9

J'utilise cette extension:

extension String {

    func replaceCharacters(characters: String, toSeparator: String) -> String {
        let characterSet = NSCharacterSet(charactersInString: characters)
        let components = self.componentsSeparatedByCharactersInSet(characterSet)
        let result = components.joinWithSeparator("")
        return result
    }

    func wipeCharacters(characters: String) -> String {
        return self.replaceCharacters(characters, toSeparator: "")
    }
}

Usage:

let token = "<34353 43434>"
token.replaceCharacters("< >", toString:"+")
Ramis
la source
8

Une solution Swift 3 sur le modèle de celle de Sunkas:

extension String {
    mutating func replace(_ originalString:String, with newString:String) {
        self = self.replacingOccurrences(of: originalString, with: newString)
    }
}

Utilisation:

var string = "foo!"
string.replace("!", with: "?")
print(string)

Production:

foo?
Josh Adams
la source
7

Une catégorie qui modifie une chaîne mutable existante:

extension String
{
    mutating func replace(originalString:String, withString newString:String)
    {
        let replacedString = self.stringByReplacingOccurrencesOfString(originalString, withString: newString, options: nil, range: nil)
        self = replacedString
    }
}

Utilisation:

name.replace(" ", withString: "+")
Sunkas
la source
4

Solution Swift 3 basée sur la réponse de Ramis :

extension String {
    func withReplacedCharacters(_ characters: String, by separator: String) -> String {
        let characterSet = CharacterSet(charactersIn: characters)
        return components(separatedBy: characterSet).joined(separator: separator)
    }
}

J'ai essayé de trouver un nom de fonction approprié selon la convention de dénomination de Swift 3.

SoftDesigner
la source
C'est ma solution préférée, car elle vous permet de remplacer plusieurs caractères à la fois.
Incinérateur
4

Il m'est moins arrivé, je veux juste changer (un mot ou un caractère) dans le String

J'ai donc utilisé le Dictionary

  extension String{
    func replace(_ dictionary: [String: String]) -> String{
          var result = String()
          var i = -1
          for (of , with): (String, String)in dictionary{
              i += 1
              if i<1{
                  result = self.replacingOccurrences(of: of, with: with)
              }else{
                  result = result.replacingOccurrences(of: of, with: with)
              }
          }
        return result
     }
    }

usage

let mobile = "+1 (800) 444-9999"
let dictionary = ["+": "00", " ": "", "(": "", ")": "", "-": ""]
let mobileResult = mobile.replace(dictionary)
print(mobileResult) // 001800444999
amin
la source
Bonne solution! Merci
Dasoga
swift fait tout son possible pour utiliser une terminologie différente pour presque tout. presque toutes les autres langues c'est justereplace
javadba
2
var str = "This is my string"
str = str.replacingOccurrences(of: " ", with: "+")
print(str)
Yash Gotecha
la source
pourquoi ne puis-je pas trouver replacingOccurrencesdedans String?
javadba
1

Je pense que Regex est le moyen le plus flexible et le plus solide:

var str = "This is my string"
let regex = try! NSRegularExpression(pattern: " ", options: [])
let output = regex.stringByReplacingMatchesInString(
    str,
    options: [],
    range: NSRange(location: 0, length: str.characters.count),
    withTemplate: "+"
)
// output: "This+is+my+string"
duan
la source
1

Extension rapide:

extension String {

    func stringByReplacing(replaceStrings set: [String], with: String) -> String {
        var stringObject = self
        for string in set {
            stringObject = self.stringByReplacingOccurrencesOfString(string, withString: with)
        }
        return stringObject
    }

}

Continuez et utilisez-le comme let replacedString = yorString.stringByReplacing(replaceStrings: [" ","?","."], with: "+")

La vitesse de la fonction est quelque chose dont je ne peux guère être fier, mais vous pouvez passer un tableau Stringen un seul passage pour faire plus d'un remplacement.

Juan Boero
la source
1

Voici l'exemple de Swift 3:

var stringToReplace = "This my string"
if let range = stringToReplace.range(of: "my") {
   stringToReplace?.replaceSubrange(range, with: "your")
} 
Övünç Metin
la source
1

C'est facile dans swift 4.2. il suffit d'utiliser replacingOccurrences(of: " ", with: "_")pour remplacer

var myStr = "This is my string"
let replaced = myStr.replacingOccurrences(of: " ", with: "_")
print(replaced)
Tariqul
la source
1

Xcode 11 • Swift 5.1

La méthode de mutation de StringProtocol replacingOccurrencespeut être implémentée comme suit:

extension RangeReplaceableCollection where Self: StringProtocol {
    mutating func replaceOccurrences<Target: StringProtocol, Replacement: StringProtocol>(of target: Target, with replacement: Replacement, options: String.CompareOptions = [], range searchRange: Range<String.Index>? = nil) {
        self = .init(replacingOccurrences(of: target, with: replacement, options: options, range: searchRange))
    }
}

var name = "This is my string"
name.replaceOccurrences(of: " ", with: "+")
print(name) // "This+is+my+string\n"
Leo Dabus
la source
1
C'est une bonne petite friandise. Merci Leo!
Peter Suwara
0

Si vous ne souhaitez pas utiliser les NSStringméthodes Objective-C , vous pouvez simplement utiliser splitet join:

var string = "This is my string"
string = join("+", split(string, isSeparator: { $0 == " " }))

split(string, isSeparator: { $0 == " " })renvoie un tableau de chaînes ( ["This", "is", "my", "string"]).

joinse joint à ces éléments avec un +, ce qui entraîne la sortie désirée: "This+is+my+string".

Aaron Brager
la source
0

J'ai implémenté cette fonction très simple:

func convap (text : String) -> String {
    return text.stringByReplacingOccurrencesOfString("'", withString: "''")
}

Vous pouvez donc écrire:

let sqlQuery = "INSERT INTO myTable (Field1, Field2) VALUES ('\(convap(value1))','\(convap(value2)')
Blasco73
la source
0

vous pouvez tester ceci:

laissez newString = test.stringByReplacingOccurrencesOfString ("", withString: "+", options: nil, plage: nil)

Haya Hashmat
la source
-1

Voici une extension pour une méthode de remplacement des occurrences sur place String, qui n'est pas une copie inutile et fait tout en place:

extension String {
    mutating func replaceOccurrences<Target: StringProtocol, Replacement: StringProtocol>(of target: Target, with replacement: Replacement, options: String.CompareOptions = [], locale: Locale? = nil) {
        var range: Range<Index>?
        repeat {
            range = self.range(of: target, options: options, range: range.map { self.index($0.lowerBound, offsetBy: replacement.count)..<self.endIndex }, locale: locale)
            if let range = range {
                self.replaceSubrange(range, with: replacement)
            }
        } while range != nil
    }
}

(La signature de la méthode imite également la signature de la String.replacingOccurrences()méthode intégrée )

Peut être utilisé de la manière suivante:

var string = "this is a string"
string.replaceOccurrences(of: " ", with: "_")
print(string) // "this_is_a_string"
Stéphane Copin
la source
J'ai mis à jour le code pour éviter les boucles infinies si le texte contenu était contenu dans le texte cible.
Stéphane Copin