Alguma maneira de substituir caracteres na Swift String?

474

Estou procurando uma maneira de substituir caracteres em um Swift String.

Exemplo: "Esta é minha string"

Gostaria de substituir "" por "+" para obter "This + is + my + string".

Como posso conseguir isso?

user3332801
fonte
Swift Extension
Juan Boero

Respostas:

912

Esta resposta foi atualizada para o Swift 4 e 5 . Se você ainda estiver usando o Swift 1, 2 ou 3, consulte o histórico de revisões.

Você tem algumas opções. Você pode fazer o que @jaumard sugeriu e usarreplacingOccurrences()

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

E, como observado por @cprcrack abaixo, os parâmetros optionse rangesão opcionais; portanto, se você não deseja especificar opções de comparação de cadeias ou um intervalo para fazer a substituição dentro, precisará apenas do seguinte.

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

Ou, se os dados estiverem em um formato específico como este, onde você está apenas substituindo caracteres de separação, você pode usar components()para quebrar a cadeia de caracteres e a matriz e, em seguida, usar a join()função para reuni-los com um separador especificado .

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

Ou, se você estiver procurando uma solução mais Swifty que não utilize a API do NSString, você pode usá-lo.

let aString = "Some search text"

let replaced = String(aString.map {
    $0 == " " ? "+" : $0
})
Mick MacCallum
fonte
9
opções e parâmetros de intervalo são opcionais
cprcrack 15/01
1
grande substituição swift2 para stringByReplacingOccurrencesOfString
rjb101
Não sei se estou fazendo algo errado, mas a segunda solução rápida 2.0 me deixa com uma string opcional. O String original é assim: "x86_64"e o novo mapeamento é parecido com"Optional([\"x\", \"8\", \"6\", \"_\", \"6\", \"4\"])"
John Shelley
7
Para quem teve problemas com o uso stringByReplacingOccurrencesOfStringno Swift 2, é necessário import Foundationpoder usar esse método.
Liron Yahdav #
1
uau, stringByReplacingOccurrencesOfString, que intuitivo! Eu estava esperando algo como makeNewStringByReplacingOccurrencesOfFirstArgumentByValueInSecondArgument
Novellizator
64

Você pode usar isto:

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

Se você adicionar esse método de extensão em qualquer lugar do seu código:

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
fonte
2
Eu não nomearia a função "replace", pois isso sugere que ela mude a variável. Use a mesma gramática da Apple. Chamá-lo de "substituir (_: withString :)" torna muito mais claro. Uma futura função de "substituição" mutante também entraria em conflito na nomeação.
Sunkas 24/04/19
57

Solução 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
fonte
Esta é uma resposta a esta pergunta.
Bijender Singh Shekhawat
19

Você testou isso:

var test = "This is my string"

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

Swift 4:

let abc = "Hello world"

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

print(result :\(result))

Resultado:

result : Hello_world
Manish
fonte
9

Estou usando esta extensão:

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: "")
    }
}

Uso:

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

Uma solução Swift 3 ao longo das linhas de Sunkas:

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

Usar:

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

Resultado:

foo?
Josh Adams
fonte
7

Uma categoria que modifica uma String mutável existente:

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

Usar:

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

Solução Swift 3 baseada na resposta de Ramis :

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

Tentei criar um nome de função apropriado de acordo com a convenção de nomenclatura do Swift 3.

SoftDesigner
fonte
Esta é a minha solução preferida, pois permite substituir vários caracteres ao mesmo tempo.
Incinerador
4

Menos aconteceu comigo, eu só quero mudar (uma palavra ou caractere) no String

Então, eu uso o 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
     }
    }

uso

let mobile = "+1 (800) 444-9999"
let dictionary = ["+": "00", " ": "", "(": "", ")": "", "-": ""]
let mobileResult = mobile.replace(dictionary)
print(mobileResult) // 001800444999
amin
fonte
Boa solução! Obrigado
Dasoga 26/09/19
O swift se esforça para usar uma terminologia diferente para quase tudo. quase todas as outras línguas é apenasreplace
javadba
2
var str = "This is my string"
str = str.replacingOccurrences(of: " ", with: "+")
print(str)
Yash Gotecha
fonte
por isso que não consigo encontrar replacingOccurrencesem String?
javadba
1

Eu acho que o Regex é a maneira mais flexível e sólida:

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
fonte
1

Extensão rápida:

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
    }

}

Vá em frente e use-o como let replacedString = yorString.stringByReplacing(replaceStrings: [" ","?","."], with: "+")

A velocidade da função é algo que eu mal posso me orgulhar, mas você pode passar uma matriz de Stringuma passagem para fazer mais de uma substituição.

Juan Boero
fonte
1

Aqui está o exemplo para o Swift 3:

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

Isso é fácil no rápido 4.2. basta usar replacingOccurrences(of: " ", with: "_")para substituir

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

Xcode 11 • Swift 5.1

O método de mutação de StringProtocol replacingOccurrencespode ser implementado da seguinte maneira:

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
fonte
1
Este é um ótimo petisco. Obrigado Leo!
Peter Suwara 19/11/19
0

Se você não quiser usar os NSStringmétodos Objective-C , basta usar splite join:

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

split(string, isSeparator: { $0 == " " })retorna uma matriz de strings ( ["This", "is", "my", "string"]).

joinjunta-se estes elementos com um +, resultando na saída desejada: "This+is+my+string".

Aaron Brager
fonte
0

Eu implementei esta função muito simples:

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

Então você pode escrever:

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

você pode testar isso:

deixe newString = test.stringByReplacingOccurrencesOfString ("", withString: "+", opções: nil, intervalo: nil)

Haya Hashmat
fonte
-1

Aqui está uma extensão para um método de substituição de ocorrências no local String, que não faz uma cópia desnecessária e faz tudo no lugar:

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

(A assinatura do método também imita a assinatura do built-in String.replacingOccurrences() método interno)

Pode ser usado da seguinte maneira:

var string = "this is a string"
string.replaceOccurrences(of: " ", with: "_")
print(string) // "this_is_a_string"
Stéphane Copin
fonte
Atualizei o código para evitar loops infinitos se o texto contido estivesse contido no texto de destino.
Stéphane Copin