¿Alguna forma de reemplazar personajes en Swift String?


474

Estoy buscando una forma de reemplazar personajes en un Swift String.

Ejemplo: "Esta es mi cadena"

Me gustaría reemplazar "" con "+" para obtener "This + is + my + string".

¿Cómo puedo conseguir esto?


Respuestas:


912

Esta respuesta se ha actualizado para Swift 4 y 5 . Si todavía usa Swift 1, 2 o 3, consulte el historial de revisiones.

Tienes unas cuantas opciones. Puedes hacer lo que @jaumard sugirió y usarreplacingOccurrences()

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

Y como lo señala @cprcrack a continuación, los parámetros optionsy rangeson opcionales, por lo que si no desea especificar opciones de comparación de cadenas o un rango para realizar el reemplazo, solo necesita lo siguiente.

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

O, si los datos están en un formato específico como este, donde solo está reemplazando los caracteres de separación, puede usar components()para dividir la cadena y la matriz, y luego puede usar la join()función para volver a unirlos con un separador específico .

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

O si está buscando una solución más Swifty que no utilice API de NSString, puede usar esto.

let aString = "Some search text"

let replaced = String(aString.map {
    $0 == " " ? "+" : $0
})

99
opciones y parámetros de rango son opcionales
— cprcrack

1
gran reemplazo de swift2 para stringByReplacingOccurrencesOfString
— rjb101

No sé si estoy haciendo algo mal, pero la segunda solución de swift 2.0 me deja con una cadena opcional. La cadena original se ve así: "x86_64"y el nuevo mapeo se ve así"Optional([\"x\", \"8\", \"6\", \"_\", \"6\", \"4\"])"
— John Shelley el

77
Para cualquiera que haya tenido problemas con el uso stringByReplacingOccurrencesOfStringen Swift 2, import Foundationdebe poder usar ese método.
— Liron Yahdav

1
wow, stringByReplacingOccurrencesOfString, ¡qué intuitivo! Esperaba algo como makeNewStringByReplacingOccurrencesOfFirstArgumentByValueInSecondArgument
— Novellizator

64

Puedes usar esto:

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

Si agrega este método de extensión en cualquier parte de su 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)
    }
}

2
No nombraría la función "reemplazar" ya que esto sugiere que muta la variable. Utiliza la misma gramática que Apple. Llamarlo "reemplazar (_: withString :)" lo hace mucho más claro. Una futura función de "reemplazo" mutante también entraría en conflicto al nombrar.
— Sunkas

57

Solución 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: "+")

Esta es una respuesta a esta pregunta.
— Bijender Singh Shekhawat

19

¿Probaste esto?

var test = "This is my string"

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

13

Swift 4:

let abc = "Hello world"

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

print(result :\(result))

Salida:

result : Hello_world

9

Estoy usando esta extensión:

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

8

Una solución Swift 3 en la línea de Sunkas:

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

Utilizar:

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

Salida:

foo?

7

Una categoría que modifica una cadena mutable existente:

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

Utilizar:

name.replace(" ", withString: "+")

4

Solución Swift 3 basada en la respuesta de Ramis :

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

Intenté encontrar un nombre de función apropiado según la convención de nomenclatura Swift 3.


Esta es mi solución preferida, ya que le permite reemplazar varios caracteres a la vez.
— Incinerador

4

Menos me sucedió, solo quiero cambiar (una palabra o carácter) en el String

Así que he usado el 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

¡Buena solución! Gracias
— Dasoga

Swift hace todo lo posible para utilizar una terminología diferente para casi todo. casi cualquier otro idioma es soloreplace
— javadba

2
var str = "This is my string"
str = str.replacingOccurrences(of: " ", with: "+")
print(str)

¿Por qué no puedo encontrar replacingOccurrencesen String?
— javadba

1

Creo que Regex es la forma más flexible y 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"

1

Extensión 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
    }

}

Sigue y úsalo como let replacedString = yorString.stringByReplacing(replaceStrings: [" ","?","."], with: "+")

La velocidad de la función es algo de lo que difícilmente puedo estar orgulloso, pero puede pasar una matriz de Stringuna sola vez para hacer más de un reemplazo.


1

Aquí está el ejemplo de Swift 3:

var stringToReplace = "This my string"
if let range = stringToReplace.range(of: "my") {
   stringToReplace?.replaceSubrange(range, with: "your")
} 

1

Esto es fácil en Swift 4.2. solo use replacingOccurrences(of: " ", with: "_")para reemplazar

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

1

Xcode 11 • Swift 5.1

El método de mutación de StringProtocol replacingOccurrencesse puede implementar de la siguiente manera:

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"

1
Este es un pequeño gran detalle. Gracias leo!
— Peter Suwara el

0

Si no desea usar los NSStringmétodos Objective-C , puede usar splity join:

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

split(string, isSeparator: { $0 == " " })devuelve una matriz de cadenas ( ["This", "is", "my", "string"]).

joinse une a estos elementos con una +, resultando en la salida deseada: "This+is+my+string".


0

He implementado esta función muy simple:

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

Entonces puedes escribir:

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

0

puedes probar esto:

let newString = test.stringByReplacingOccurrencesOfString ("", withString: "+", opciones: nil, rango: nil)


-1

Aquí hay una extensión para un método de reemplazo de ocurrencias en el lugar String, que no requiere una copia innecesaria y hace todo en su 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
    }
}

(La firma del método también imita la firma del String.replacingOccurrences()método incorporado )

Se puede usar de la siguiente manera:

var string = "this is a string"
string.replaceOccurrences(of: " ", with: "_")
print(string) // "this_is_a_string"

He actualizado el código para evitar bucles infinitos si el texto contenido estaba contenido en el texto de destino.
— Stéphane Copin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.