Adakah cara untuk mengganti karakter di Swift String?

474

Saya mencari cara untuk mengganti karakter dalam Swift String.

Contoh: "Ini tali saya"

Saya ingin mengganti "" dengan "+" untuk mendapatkan "+ ini + string + saya".

Bagaimana saya bisa mencapai ini?

pengguna3332801
sumber
Swift Extension
Juan Boero

Jawaban:

912

Jawaban ini telah diperbarui untuk Swift 4 & 5 . Jika Anda masih menggunakan Swift 1, 2 atau 3 lihat riwayat revisi.

Anda memiliki dua pilihan. Anda dapat melakukan seperti yang disarankan dan digunakan @jaumardreplacingOccurrences()

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

Dan seperti yang dicatat oleh @cprcrack di bawah ini, optionsdan rangeparameter adalah opsional, jadi jika Anda tidak ingin menentukan opsi perbandingan string atau rentang untuk melakukan penggantian di dalamnya, Anda hanya perlu yang berikut ini.

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

Atau, jika data dalam format tertentu seperti ini, di mana Anda hanya mengganti karakter pemisah, Anda dapat menggunakan components()untuk memecah string menjadi dan array, dan kemudian Anda dapat menggunakan join()fungsi untuk menempatkan mereka kembali bersama-sama dengan pemisah yang ditentukan .

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

Atau jika Anda mencari solusi Swifty yang tidak menggunakan API dari NSString, Anda bisa menggunakan ini.

let aString = "Some search text"

let replaced = String(aString.map {
    $0 == " " ? "+" : $0
})
Mick MacCallum
sumber
9
opsi dan parameter rentang adalah opsional
cprcrack
1
pengganti swift2 yang bagus untuk stringByReplacingOccurrencesOfString
rjb101
Saya tidak tahu apakah saya melakukan sesuatu yang salah tetapi solusi 2.0 cepat kedua membuat saya dengan dan string opsional. String Asli terlihat seperti ini: "x86_64"dan pemetaan baru terlihat seperti"Optional([\"x\", \"8\", \"6\", \"_\", \"6\", \"4\"])"
John Shelley
7
Bagi siapa pun yang memiliki masalah dengan menggunakan stringByReplacingOccurrencesOfStringdi Swift 2, Anda harus import Foundationdapat menggunakan metode itu.
Liron Yahdav
1
wow, stringDengan menggantiOursiOfString, betapa intuitif! Saya mengharapkan sesuatu seperti makeNewStringByReplacingOccurrencesOfFirstArgumentByValueInSecondArgument
Novellizator
64

Anda bisa menggunakan ini:

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

Jika Anda menambahkan metode ekstensi ini di mana saja dalam kode Anda:

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
sumber
2
Saya tidak akan memberi nama fungsi "ganti" karena ini menyarankan itu bermutasi variabel. Gunakan tata bahasa yang sama seperti yang dilakukan Apple. Menyebutnya "mengganti (_: withString :)" membuatnya lebih jelas. Fungsi mutasi "ganti" yang akan datang juga akan konflik dalam penamaan.
Sunkas
57

Solusi 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
sumber
ini adalah jawaban untuk pertanyaan ini.
Bijender Singh Shekhawat
19

Apakah Anda menguji ini:

var test = "This is my string"

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

Swift 4:

let abc = "Hello world"

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

print(result :\(result))

Keluaran:

result : Hello_world
Manish
sumber
9

Saya menggunakan ekstensi ini:

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

Pemakaian:

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

Solusi Swift 3 di sepanjang lini Sunkas:

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

Menggunakan:

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

Keluaran:

foo?
Josh Adams
sumber
7

Kategori yang mengubah String yang dapat berubah yang ada:

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

Menggunakan:

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

Solusi Swift 3 berdasarkan jawaban Ramis :

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

Mencoba menampilkan nama fungsi yang sesuai dengan konvensi penamaan Swift 3.

SoftDesigner
sumber
Ini adalah solusi yang saya sukai, karena memungkinkan Anda mengganti beberapa karakter sekaligus.
Insinerator
4

Kurang terjadi pada saya, saya hanya ingin mengubah (kata atau karakter) di String

Jadi saya sudah menggunakan 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
     }
    }

pemakaian

let mobile = "+1 (800) 444-9999"
let dictionary = ["+": "00", " ": "", "(": "", ")": "", "-": ""]
let mobileResult = mobile.replace(dictionary)
print(mobileResult) // 001800444999
amin
sumber
Solusi bagus! Terima kasih
Dasoga
Swift keluar dari caranya untuk menggunakan terminologi yang berbeda untuk hampir semua hal. hampir semua bahasa lain hanyareplace
javadba
2
var str = "This is my string"
str = str.replacingOccurrences(of: " ", with: "+")
print(str)
Yash Gotecha
sumber
kenapa aku tidak bisa menemukan replacingOccurrences di String?
javadba
1

Saya pikir Regex adalah cara yang paling fleksibel dan solid:

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

Ekstensi cepat:

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
    }

}

Lanjutkan dan gunakan seperti let replacedString = yorString.stringByReplacing(replaceStrings: [" ","?","."], with: "+")

Kecepatan fungsi adalah sesuatu yang sulit saya banggakan, tetapi Anda dapat melewati array Stringdalam satu pass untuk membuat lebih dari satu penggantian.

Juan Boero
sumber
1

Berikut adalah contoh untuk Swift 3:

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

Ini mudah di swift 4.2. gunakan saja replacingOccurrences(of: " ", with: "_")untuk ganti

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

Xcode 11 • Swift 5.1

Metode mutasi dari StringProtocol replacingOccurrencesdapat diimplementasikan sebagai berikut:

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
sumber
1
Ini adalah berita gembira kecil yang hebat. Leo terima kasih!
Peter Suwara
0

Jika Anda tidak ingin menggunakan metode Objective-C NSString, Anda bisa menggunakan splitdan join:

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

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

joinbergabung elemen-elemen ini dengan +, menghasilkan output yang diinginkan: "This+is+my+string".

Aaron Brager
sumber
0

Saya telah mengimplementasikan fungsi yang sangat sederhana ini:

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

Jadi, Anda dapat menulis:

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

Anda dapat menguji ini:

biarkan newString = test.stringByReplacingOccurrencesOfString ("", withString: "+", opsi: nil, rentang: nil)

Haya Hashmat
sumber
-1

Berikut ini adalah ekstensi untuk menggantikan metode kejadian di tempat String, yang tidak memiliki salinan yang tidak perlu dan melakukan semuanya di tempat:

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

(Tanda tangan metode juga meniru tanda tangan dari String.replacingOccurrences()metode bawaan)

Dapat digunakan dengan cara berikut:

var string = "this is a string"
string.replaceOccurrences(of: " ", with: "_")
print(string) // "this_is_a_string"
Stéphane Copin
sumber
Saya telah memperbarui kode untuk mencegah loop tak terbatas jika teks yang terkandung terkandung dalam teks target.
Stéphane Copin