2014-06-13 9 views
304

Sto cercando un modo per sostituire i caratteri in uno Swift String.Un modo per sostituire i caratteri su Swift String?

Esempio: "This is my string"

mi piacerebbe sostituire con + per ottenere: "This+is+my+string".

Come posso ottenere questo risultato?

+0

[Swift Extension] (http://stackoverflow.com/a/39841550/1634890) –

risposta

602

Questa risposta è stata aggiornamento per Swift 3. Se stai ancora utilizzando Swift 1 o 2, consulta la cronologia delle revisioni.

Hai un paio di opzioni. Si può fare come suggerito @jaumard e utilizzare replacingOccurrences()

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

E come ha osservato @cprcrack seguito, i parametri options e range sono opzionali, quindi se non si desidera specificare le opzioni di confronto di stringa o un intervallo di fare la sostituzione all'interno, è necessario solo il seguente.

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

Oppure, se i dati sono in un formato specifico come questo, dove si sta solo sostituendo i caratteri di separazione, è possibile utilizzare components() per rompere la stringa in e la matrice, e quindi è possibile utilizzare la funzione di join() rimettili insieme con un separatore specificato.

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

Oppure, se siete alla ricerca di una soluzione più Swifty che non utilizza API da NSString, si potrebbe usare questo.

let aString = "Some search text" 

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

** opzioni ** e ** ** gamma parametri sono opzionali – cprcrack

+1

ottimo sostituto swift2 per stringByReplacingOccurrencesOfString – rjb101

+0

Non so se sto facendo qualcosa di sbagliato ma la seconda soluzione swift 2.0 mi lascia con una stringa opzionale. La stringa originale ha il seguente aspetto: '" x86_64 "' e la nuova mappatura appare come '" Opzionale ([\ "x \", \ "8 \", \ "6 \", \ "_ \", \ "6 \ ", \" 4 \ "])" ' –

16

Avete provato questo:

var test = "This is my string" 

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

È possibile utilizzare questo:

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

Se si aggiunge questo metodo di estensione qualsiasi punto del codice:

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

una categoria che modifica una stringa mutabile esistente:

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

Usa:

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

Se non si desidera utilizzare l'Objective-C NSString metodi, si può semplicemente utilizzare split e join:

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

split(string, isSeparator: { $0 == " " }) restituisce un array di stringhe (["This", "is", "my", "string"]).

join unisce questi elementi con un +, ottenendo l'output desiderato: "This+is+my+string".

6

Sto usando questa estensione:

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

grazie a @Ramis funziona davvero bene per me –

0

Ho implementato questo molto facile func:

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

Così si può scrivere:

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

Swift 3 Soluzione

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

Penso Regex è il modo più flessibile e solida:

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" 
0

Swift estensione:

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 
    } 

} 

Vai avanti e usarlo come let replacedString = yorString.stringByReplacing(replaceStrings: [" ","?","."], with: "+")

La velocità della funzione è qualcosa di cui non posso essere orgoglioso, ma è possibile passare una serie di String in una sola passata per effettuare più di una sostituzione.

2

Ecco l'esempio per Swift 3:

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

A Swift 3 soluzione lungo le linee di Sunkas di:

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

Usa:

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

uscita:

foo? 
3

Swift 3 soluzione basata su Ramis' answer:

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

cercato di venire con un nome funzione appropriata secondo Swift 3 convenzione di denominazione.

+0

Questa è la mia soluzione preferita, come ti consente di sostituire più caratteri contemporaneamente. – Incinerator

0

Ecco un estensione per un in-posto occorrenze metodo replace su String, che non Nessun una copia inutile e fare tutto a posto:

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

(la firma del metodo imita anche la firma del costruito -in String.replacingOccurrences() metodo)

Può essere utilizzato nel modo seguente:

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

Swift 4:

let abc = "Hello world" 

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

print(result :\(result)) 

uscita:

result : Hello_world 
Problemi correlati