มีวิธีใดบ้างที่จะแทนที่ตัวละครใน Swift String?


474

Stringฉันกำลังมองหาวิธีการแทนที่ตัวอักษรในรวดเร็ว

ตัวอย่าง: "นี่คือสตริงของฉัน"

ฉันต้องการแทนที่ "" ด้วย "+" เพื่อรับ "This + is + my + string"

ฉันจะบรรลุสิ่งนี้ได้อย่างไร


คำตอบ:


912

คำตอบนี้ได้รับการปรับปรุงสำหรับ Swift 4 และ 55 หากคุณยังคงใช้งาน Swift 1, 2 หรือ 3 ดูประวัติการแก้ไข

คุณมีสองทางเลือก คุณสามารถทำตาม @jaumard แนะนำและใช้replacingOccurrences()

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

และตามที่บันทึกไว้โดย @cprcrack ด้านล่างoptionsและrangeพารามิเตอร์เป็นทางเลือกดังนั้นหากคุณไม่ต้องการระบุตัวเลือกการเปรียบเทียบสตริงหรือช่วงที่จะทำการแทนที่ภายในคุณจำเป็นต้องมีสิ่งต่อไปนี้เท่านั้น

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

หรือถ้าข้อมูลอยู่ในรูปแบบเฉพาะเช่นนี้ซึ่งคุณเพียงแค่แทนที่อักขระการแยกคุณสามารถใช้components()เพื่อแยกสตริงเป็นและอาร์เรย์จากนั้นคุณสามารถใช้join()ฟังก์ชันเพื่อนำกลับมารวมกับตัวคั่นที่ระบุ .

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

หรือถ้าคุณกำลังมองหาโซลูชัน Swifty ที่ไม่ได้ใช้ API จาก NSString คุณสามารถใช้มันได้

let aString = "Some search text"

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

9
ตัวเลือกและพารามิเตอร์ช่วงเป็นตัวเลือก
cprcrack

1
swift2 ที่ยอดเยี่ยมสำหรับการแทนที่สตริงโดยการแทนที่ค่าสกุลเงินของสตริง
rjb101

ฉันไม่รู้ว่าฉันกำลังทำอะไรผิดหรือเปล่า แต่โซลูชัน swift 2.0 ตัวที่สองทำให้ฉันมีสตริงที่ไม่จำเป็น String ดั้งเดิมมีลักษณะดังนี้: "x86_64"และการแมปใหม่มีลักษณะดังนี้"Optional([\"x\", \"8\", \"6\", \"_\", \"6\", \"4\"])"
John Shelley

7
สำหรับผู้ที่มีปัญหาstringByReplacingOccurrencesOfStringในการใช้งานSwift 2 คุณต้องimport Foundationสามารถใช้วิธีการนั้นได้
Liron Yahdav

1
ว้าว, stringByReplacingOccurrencesOfString วิธีใช้งานง่าย! ฉันคาดหวังว่าบางสิ่งเช่นการสร้าง newStringByReplacingOccurrencesOfFirstArgumentByValueInSecondArgument
Novellizator

64

คุณสามารถใช้สิ่งนี้:

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

หากคุณเพิ่มวิธีการขยายนี้ทุกที่ในรหัสของคุณ:

extension String
{
    func replace(target: String, withString: String) -> String
    {
       return self.stringByReplacingOccurrencesOfString(target, withString: withString, options: NSStringCompareOptions.LiteralSearch, range: nil)
    }
}

สวิฟท์ 3:

extension String
{
    func replace(target: String, withString: String) -> String
    {
        return self.replacingOccurrences(of: target, with: withString, options: NSString.CompareOptions.literal, range: nil)
    }
}

2
ฉันจะไม่ตั้งชื่อฟังก์ชั่น "แทนที่" เช่นนี้ขอแนะนำให้มันกลายพันธุ์ตัวแปร ใช้ไวยากรณ์เดียวกับที่ Apple ทำ การเรียกว่า "replace (_: withString :)" ทำให้ชัดเจนยิ่งขึ้น ฟังก์ชั่น "เปลี่ยน" การกลายพันธุ์ในอนาคตจะขัดแย้งกันในการตั้งชื่อ
Sunkas

57

Swift 3, Swift 4, Swift 5 Solution

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

นี่คือคำตอบสำหรับคำถามนี้
Bijender Singh Shekhawat

19

คุณทดสอบสิ่งนี้หรือไม่:

var test = "This is my string"

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

13

สวิฟท์ 4:

let abc = "Hello world"

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

print(result :\(result))

เอาท์พุท:

result : Hello_world

9

ฉันใช้ส่วนขยายนี้:

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

การใช้งาน:

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

8

โซลูชัน Swift 3 ตามแนวของ Sunkas:

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

ใช้:

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

เอาท์พุท:

foo?

7

หมวดหมู่ที่แก้ไขสตริงที่ไม่แน่นอนที่มีอยู่:

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

ใช้:

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

4

โซลูชัน Swift 3 ขึ้นอยู่กับคำตอบของ Ramis :

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

พยายามคิดชื่อฟังก์ชั่นที่เหมาะสมตามแบบแผนการตั้งชื่อ Swift 3


นี่เป็นโซลูชันที่ฉันต้องการเนื่องจากช่วยให้คุณสามารถแทนที่อักขระได้หลายตัวพร้อมกัน
เตาเผาขยะ

4

เกิดขึ้นกับฉันน้อยฉันแค่ต้องการเปลี่ยน (คำหรือตัวอักษร) ใน String

ดังนั้นฉันใช้ 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
     }
    }

การใช้

let mobile = "+1 (800) 444-9999"
let dictionary = ["+": "00", " ": "", "(": "", ")": "", "-": ""]
let mobileResult = mobile.replace(dictionary)
print(mobileResult) // 001800444999

ทางออกที่ดี! ขอบคุณ
Dasoga

swift ออกไปเพื่อใช้คำศัพท์ที่แตกต่างกันสำหรับเกือบทุกอย่าง เกือบทุกภาษาอื่น ๆ มันเป็นเพียงreplace
javadba


1

ฉันคิดว่า Regex เป็นวิธีที่ยืดหยุ่นและมั่นคงที่สุด:

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

ส่วนขยายที่รวดเร็ว:

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
    }

}

ไปและใช้มันเหมือน let replacedString = yorString.stringByReplacing(replaceStrings: [" ","?","."], with: "+")

ความเร็วของฟังก์ชั่นเป็นสิ่งที่ฉันแทบจะไม่ภาคภูมิใจ แต่คุณสามารถผ่านอาเรย์ของStringหนึ่งผ่านเพื่อทำการแทนที่มากกว่าหนึ่ง


1

นี่คือตัวอย่างสำหรับ Swift 3:

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

1

นี่เป็นเรื่องง่ายใน 4.2 ที่รวดเร็ว เพียงใช้replacingOccurrences(of: " ", with: "_")สำหรับแทนที่

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

1

Xcode 11 • Swift 5.1

วิธีการกลายพันธุ์ของ StringProtocol replacingOccurrencesสามารถนำไปใช้ดังนี้:

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
นี่เป็นอาหารอันโอชะน้อยที่ดี ขอบคุณลีโอ!
ปีเตอร์ซูวารา

0

หากคุณไม่ต้องการใช้วิธีการ Objective-C NSStringคุณสามารถใช้splitและjoin:

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

split(string, isSeparator: { $0 == " " }) ส่งกลับอาร์เรย์ของสตริง (["This", "is", "my", "string"] )

joinรวมองค์ประกอบเหล่านี้ด้วย+, ส่งผลให้ผลลัพธ์ที่ต้องการ: "This+is+my+string".


0

ฉันใช้งาน func ง่าย ๆ นี้:

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

ดังนั้นคุณสามารถเขียน:

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

0

คุณสามารถทดสอบสิ่งนี้:

ให้ newString = test.stringByReplacingOccurrencesOfString ("", withString: "+", ตัวเลือก: ไม่มี, ช่วง: ไม่มี)


-1

ต่อไปนี้เป็นส่วนขยายสำหรับวิธีการแทนที่แบบแทนที่Stringโดยไม่ทำสำเนาที่ไม่จำเป็นและทำทุกอย่างแทน:

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

(ลายเซ็นวิธีการยังเลียนแบบลายเซ็นของString.replacingOccurrences()วิธีการในตัวด้วย)

อาจใช้วิธีต่อไปนี้:

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

ฉันได้อัปเดตรหัสเพื่อป้องกันการวนซ้ำไม่สิ้นสุดหากข้อความที่บรรจุอยู่ในข้อความเป้าหมาย
Stéphane Copin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.