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?


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

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

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

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)

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

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

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?

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

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.


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

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)

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"

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.


1

Berikut adalah contoh untuk Swift 3:

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

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)

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"

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


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)')

0

Anda dapat menguji ini:

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


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

Saya telah memperbarui kode untuk mencegah loop tak terbatas jika teks yang terkandung terkandung dalam teks target.
Stéphane Copin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.