मैं एक स्विफ्ट में पात्रों को बदलने का एक तरीका ढूंढ रहा हूं String
।
उदाहरण: "यह मेरी स्ट्रिंग है"
मैं "This + is + my + string" प्राप्त करने के लिए "" + "के साथ" को बदलना चाहूंगा।
इसे कैसे प्राप्त किया जा सकता है?
मैं एक स्विफ्ट में पात्रों को बदलने का एक तरीका ढूंढ रहा हूं String
।
उदाहरण: "यह मेरी स्ट्रिंग है"
मैं "This + is + my + string" प्राप्त करने के लिए "" + "के साथ" को बदलना चाहूंगा।
इसे कैसे प्राप्त किया जा सकता है?
जवाबों:
यह उत्तर स्विफ्ट 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
})
"x86_64"
और नया मैपिंग ऐसा दिखता है"Optional([\"x\", \"8\", \"6\", \"_\", \"6\", \"4\"])"
stringByReplacingOccurrencesOfString
स्विफ्ट 2 का उपयोग करने में समस्या थी , आपको import Foundation
उस पद्धति का उपयोग करने में सक्षम होने की आवश्यकता है ।
आप इसका उपयोग कर सकते हैं:
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)
}
}
स्विफ्ट 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: "+")
मैं इस एक्सटेंशन का उपयोग कर रहा हूं:
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:"+")
सनकों की तर्ज पर एक स्विफ्ट 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?
एक श्रेणी जो एक मौजूदा परिवर्तनशील स्ट्रिंग को संशोधित करती है:
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: "+")
रामियों के उत्तर पर आधारित स्विफ्ट 3 समाधान :
extension String {
func withReplacedCharacters(_ characters: String, by separator: String) -> String {
let characterSet = CharacterSet(charactersIn: characters)
return components(separatedBy: characterSet).joined(separator: separator)
}
}
स्विफ्ट 3 नामकरण सम्मेलन के अनुसार एक उपयुक्त फ़ंक्शन नाम के साथ आने की कोशिश की।
मेरे साथ कम हुआ, मैं बस (एक शब्द या चरित्र) में बदलना चाहता हूं 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
replace
मुझे लगता है कि रेगेक्स सबसे लचीला और ठोस तरीका है:
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"
स्विफ्ट एक्सटेंशन:
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
एक से अधिक प्रतिस्थापन बनाने के लिए पास कर सकते हैं।
यहां स्विफ्ट 3 का उदाहरण दिया गया है:
var stringToReplace = "This my string"
if let range = stringToReplace.range(of: "my") {
stringToReplace?.replaceSubrange(range, with: "your")
}
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"
यदि आप उद्देश्य-सी 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"
:।
यहां इन-प्लेस आवृत्तियों को बदलने के तरीके का विस्तार किया गया है 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"