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

474

Я ищу способ замены персонажей в Swift String.

Пример: «Это моя строка»

Я хотел бы заменить "" на "+", чтобы получить "This + is + my + string".

Как мне этого добиться?

user3332801
источник
Свифт Расширение
Хуан Боэро

Ответы:

912

Этот ответ был обновлен для Swift 4 и 5 . Если вы все еще используете 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 для stringByReplacingOccurferencesOfString
rjb101
Я не знаю, делаю ли я что-то не так, но второе быстрое решение 2.0 оставляет меня с необязательной строкой. Оригинальная строка выглядит следующим образом: "x86_64"а новое отображение выглядит как"Optional([\"x\", \"8\", \"6\", \"_\", \"6\", \"4\"])"
Джон Шелли
7
Для тех, у кого были проблемы с использованием stringByReplacingOccurrencesOfStringв Swift 2, вам нужно import Foundationиметь возможность использовать этот метод.
Лирон Яхдав
1
вау, stringByReplacingOccurferencesOfString, как интуитивно понятно! Я что - то вроде 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)
    }
}
whitneyland
источник
2
Я бы не назвал функцию «заменить», поскольку это предполагает, что она изменяет переменную. Используйте ту же грамматику, что и в Apple. Называя его «замена (_: 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)
jaumard
источник
13

Свифт 4:

let abc = "Hello world"

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

print(result :\(result))

Вывод:

result : Hello_world
Manish
источник
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: "+")
Sunkas
источник
4

Решение 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.

SoftDesigner
источник
Это мое предпочтительное решение, поскольку оно позволяет заменять несколько символов одновременно.
мусоросжигатель
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
Амин
источник
Хорошее решение! Спасибо
Дасога
Swift старается изо всех сил использовать различную терминологию для почти всего. почти любые другие языки это простоreplace
Джавадба
2
var str = "This is my string"
str = str.replacingOccurrences(of: " ", with: "+")
print(str)
Яш Готеча
источник
почему я не могу найти replacingOccurrencesв String?
Джавадба
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")
} 
Övünç Metin
источник
1

Это легко и быстро. 4.2. просто использовать replacingOccurrences(of: " ", with: "_")для замены

var myStr = "This is my string"
let replaced = myStr.replacingOccurrences(of: " ", with: "_")
print(replaced)
Tariqul
источник
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

Если вы не хотите использовать NSStringметоды Objective-C , вы можете просто использовать 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)')
Blasco73
источник
0

Вы можете проверить это:

let newString = test.stringByReplacingOccurferencesOfString ("", 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"
Стефан Копен
источник
Я обновил код, чтобы предотвратить бесконечные циклы, если содержащийся текст содержался в целевом тексте.
Стефан Копен