स्विफ्ट स्ट्रिंग पर पात्रों को बदलने का कोई तरीका?


474

मैं एक स्विफ्ट में पात्रों को बदलने का एक तरीका ढूंढ रहा हूं String

उदाहरण: "यह मेरी स्ट्रिंग है"

मैं "This + is + my + string" प्राप्त करने के लिए "" + "के साथ" को बदलना चाहूंगा।

इसे कैसे प्राप्त किया जा सकता है?


जवाबों:


912

यह उत्तर स्विफ्ट 4 और 5 के लिए अद्यतन किया गया है । यदि आप अभी भी स्विफ्ट 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 समाधान की तलाश कर रहे हैं जो NSString से API का उपयोग नहीं करता है, तो आप इसका उपयोग कर सकते हैं।

let aString = "Some search text"

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

9
विकल्प और रेंज पैरामीटर वैकल्पिक हैं
cprcrack

1
stringByReplacingOccurrencesOfString के लिए बढ़िया स्विफ्ट 2 रिप्लेसमेंट
rjb101

मुझे नहीं पता कि मैं कुछ गलत कर रहा हूं, लेकिन दूसरा तेज 2.0 समाधान मुझे और वैकल्पिक स्ट्रिंग के साथ छोड़ देता है। ओरिजिनल स्ट्रिंग इस तरह दिखता है: "x86_64"और नया मैपिंग ऐसा दिखता है"Optional([\"x\", \"8\", \"6\", \"_\", \"6\", \"4\"])"
जॉन शेली

7
किसी के लिए जो stringByReplacingOccurrencesOfStringस्विफ्ट 2 का उपयोग करने में समस्या थी , आपको import Foundationउस पद्धति का उपयोग करने में सक्षम होने की आवश्यकता है ।
लिरॉन याहदव

1
वाह, stringByReplacingOccurrencesOfString, कितना सहज ज्ञान युक्त! मैं कुछ बनाने की उम्मीद कर रहा था जैसे MakeNewStringByReplacingOccurrencesOfFirstArgumentByValueInSecondArgument
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 व्याकरण की तरह ही व्याकरण का उपयोग करें। इसे "रीप्लेसिंग (_: withString :)" कहकर पुकारने से यह और अधिक स्पष्ट हो जाता है। एक भावी उत्परिवर्तन "बदलें" फ़ंक्शन नामकरण में भी संघर्ष करेगा।
सूर्यकास २४'१

57

स्विफ्ट 3, स्विफ्ट 4, स्विफ्ट 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: "+")

यह इस प्रश्न का उत्तर है।
बिजेन्द्र सिंह शेखावत

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

सनकों की तर्ज पर एक स्विफ्ट 3 समाधान:

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

रामियों के उत्तर पर आधारित स्विफ्ट 3 समाधान :

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

स्विफ्ट 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

स्विफ्ट लगभग हर चीज के लिए विभिन्न शब्दावली का उपयोग करने के लिए अपने रास्ते से बाहर चला जाता है। लगभग किसी भी अन्य भाषा में यह सिर्फ हैreplace
javadba


1

मुझे लगता है कि रेगेक्स सबसे लचीला और ठोस तरीका है:

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

यहां स्विफ्ट 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 • स्विफ्ट 5.1

स्ट्रिंगप्रोटोकॉल की उत्परिवर्तन विधि को निम्नानुसार 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

यदि आप उद्देश्य-सी 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 convap (text : String) -> String {
    return text.stringByReplacingOccurrencesOfString("'", withString: "''")
}

तो आप लिख सकते हैं:

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

0

आप इसका परीक्षण कर सकते हैं:

let newString = test.stringByReplacingOccurrencesOfString ("", withString: "+", विकल्प: nil, रेंज: nil)


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

यदि लक्ष्य पाठ में समाहित पाठ समाहित है, तो मैंने अनंत लूप को रोकने के लिए कोड को अपडेट किया है।
स्टीफन कोपिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.