Любой способ заменить символы на Swift String?

Я ищу способ заменить символы в Swift String.

пример: "This is my string"

Я хотел бы заменить with + для: "This+is+my+string".

как я могу этого достичь?

15 ответов


ответ обновлено для Swift 4. Если вы все еще используете 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: "+")

или если вы ищете более быстрое решение, которое не использует API из NSString, вы можете использовать это.

let aString = "Some search text"

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

вы можете использовать это:

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

Swift 3:

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

Swift 3, Swift 4 Решение

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

вы проверили это:

var test = "This is my string"

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

Swift 4:

let abc = "Hello world"

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

print(result :\(result))

выход:

result : Hello_world

быстрое решение 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?

Я использую это расширений:

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

категория, которая изменяет существующую изменяемую строку:

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

Swift 3 решение на основе Рамис' ответ:

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

попытался придумать подходящее имя функции в соответствии с Соглашением об именах Swift 3.


вот пример для Swift 3:

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

вот расширение для вхождения на месте заменить метод на String, это не делает никакой ненужной копии и делает все на месте:

extension String {
    mutating func replaceOccurrences(of target: String, with replacement: String, options: String.CompareOptions = [], locale: Locale? = nil) {
        var range: Range<String.Index>?
        repeat {
            range = self.range(of: source, options: options, range: range.map { .lowerBound..<self.endIndex }, locale: locale)
            if let range = range {
                self.replaceSubrange(range, with: new)
            }
        } while range != nil
    }
}

(подпись метода также имитирует подпись встроенного String.replacingOccurrences() способ)

может использоваться следующим образом:

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

если вы не хотите использовать цель-C NSString методы, вы можете просто использовать split и join:

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

split(string, isSeparator: { == " " }) возвращает массив строк (["This", "is", "my", "string"]).

join соединяет эти элементы с +, в результате чего желаемый результат: "This+is+my+string".


я реализовал этот очень простой func:

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

вы можете написать так:

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

Я думаю, что 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"

Swift расширение:

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 в одном проходе, чтобы сделать более одной замены.