W jakiś sposób zastąpić znaki w Swift String?

474

Szukam sposobu na zamianę postaci w jerzyku String.

Przykład: „To jest mój ciąg”

Chciałbym zamienić „” na „+”, aby otrzymać „This + is + my + string”.

Jak mogę to osiągnąć?

użytkownik3332801
źródło
Szybkie

Odpowiedzi:

912

Ta odpowiedź została zaktualizowana dla Swift 4 i 5 . Jeśli nadal używasz Swift 1, 2 lub 3, zobacz historię zmian.

Masz kilka opcji. Możesz zrobić zgodnie z sugestią @jaumard i użyćreplacingOccurrences()

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

Jak zauważono poniżej przez @cprcrack, parametry optionsi rangesą opcjonalne, więc jeśli nie chcesz określać opcji porównywania ciągów lub zakresu w celu wykonania zamiany, potrzebujesz tylko następujących elementów.

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

Lub, jeśli dane mają określony format, taki jak ten, w którym właśnie zastępujesz znaki separacji, możesz użyć, components()aby rozbić ciąg na i tablicę, a następnie możesz użyć join()funkcji, aby połączyć je z powrotem z określonym separatorem .

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

Lub jeśli szukasz bardziej Swifty rozwiązania, które nie korzysta z API z NSString, możesz to wykorzystać.

let aString = "Some search text"

let replaced = String(aString.map {
    $0 == " " ? "+" : $0
})
Mick MacCallum
źródło
9
opcje i parametry zakresu są opcjonalne
cprcrack 15.01.2015
1
świetny zamiennik swift2 dla stringByReplacingOccurrencesOfString
rjb101
Nie wiem, czy robię coś nie tak, ale drugie szybkie rozwiązanie 2.0 pozostawia mi opcjonalny ciąg. Oryginalny ciąg wygląda tak: "x86_64"a nowe mapowanie wygląda"Optional([\"x\", \"8\", \"6\", \"_\", \"6\", \"4\"])"
John Shelley
7
Każdy, kto miał problemy z używaniem stringByReplacingOccurrencesOfStringw Swift 2, musi import Foundationmieć możliwość korzystania z tej metody.
Liron Yahdav
1
wow, stringByReplacingOccurrencesOfString, jak intuicyjnie! Spodziewałem się czegoś takiego jak makeNewStringByReplacingOccurrencesOfFirstArgumentByValueInSecondArgument
Novellizator
64

Możesz użyć tego:

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

Jeśli dodasz tę metodę rozszerzenia w dowolnym miejscu w kodzie:

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)
    }
}
Whitneyland
źródło
2
Nie nazwałbym funkcji „zamień”, ponieważ sugeruje to, że mutuje ona zmienną. Używaj tej samej gramatyki, co Apple. Nazwanie go „zamienianiem (_: withString :)” sprawia, że ​​jest to o wiele wyraźniejsze. Przyszła funkcja mutacji „zamień” również kolidowałaby w nazewnictwie.
Sunkas
57

Rozwiązanie Swift 3, Swift 4, Swift 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: "+")
Ben Sullivan
źródło
to jest odpowiedź na to pytanie.
Bijender Singh Shekhawat
19

Czy przetestowałeś to:

var test = "This is my string"

let replaced = test.stringByReplacingOccurrencesOfString(" ", withString: "+", options: nil, range: nil)
jaumard
źródło
13

Swift 4:

let abc = "Hello world"

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

print(result :\(result))

Wynik:

result : Hello_world
Manish
źródło
9

Używam tego rozszerzenia:

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

Stosowanie:

let token = "<34353 43434>"
token.replaceCharacters("< >", toString:"+")
Ramis
źródło
8

Rozwiązanie Swift 3 na wzór Sunkasa:

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

Posługiwać się:

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

Wynik:

foo?
Josh Adams
źródło
7

Kategoria, która modyfikuje istniejący zmienny ciąg:

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

Posługiwać się:

name.replace(" ", withString: "+")
Sunkas
źródło
4

Rozwiązanie Swift 3 oparte na odpowiedzi Ramisa :

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

Próbowałem wymyślić odpowiednią nazwę funkcji zgodnie z konwencją nazewnictwa Swift 3.

SoftDesigner
źródło
To jest moje preferowane rozwiązanie, ponieważ pozwala zastąpić wiele znaków jednocześnie.
Spalarnia
4

Mniej mi się przydarzyło, chcę tylko zmienić (słowo lub znak) w String

Więc korzystam z 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
     }
    }

stosowanie

let mobile = "+1 (800) 444-9999"
let dictionary = ["+": "00", " ": "", "(": "", ")": "", "-": ""]
let mobileResult = mobile.replace(dictionary)
print(mobileResult) // 001800444999
jestem w
źródło
Dobre rozwiązanie! Dzięki
Dasoga,
swift robi wszystko, by używać niemal każdej terminologii. prawie wszystkie inne języki to po prostureplace
javadba
2
var str = "This is my string"
str = str.replacingOccurrences(of: " ", with: "+")
print(str)
Yash Gotecha
źródło
dlaczego nie mogę znaleźć replacingOccurrencesw String?
javadba
1

Myślę, że Regex to najbardziej elastyczny i solidny sposób:

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"
duan
źródło
1

Szybkie rozszerzenie:

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
    }

}

Idź dalej i używaj go jak let replacedString = yorString.stringByReplacing(replaceStrings: [" ","?","."], with: "+")

Szybkość funkcji jest czymś, z czego nie mogę się pochwalić, ale możesz przekazać tablicę Stringw jednym przejściu, aby wykonać więcej niż jedną zamianę.

Juan Boero
źródło
1

Oto przykład Swift 3:

var stringToReplace = "This my string"
if let range = stringToReplace.range(of: "my") {
   stringToReplace?.replaceSubrange(range, with: "your")
} 
Övünç Metin
źródło
1

Jest to łatwe w szybkim 4.2. wystarczy użyć replacingOccurrences(of: " ", with: "_")do zamiany

var myStr = "This is my string"
let replaced = myStr.replacingOccurrences(of: " ", with: "_")
print(replaced)
Tariqul
źródło
1

Xcode 11 • Swift 5.1

Metodę mutacji StringProtocol replacingOccurrencesmożna zaimplementować w następujący sposób:

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"
Leo Dabus
źródło
1
To świetny mały smakołyk. Dzięki Leo!
Peter Suwara,
0

Jeśli nie chcesz używać NSStringmetod Objective-C , możesz po prostu użyć spliti join:

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

split(string, isSeparator: { $0 == " " })zwraca tablicę ciągów ( ["This", "is", "my", "string"]).

joinłączy się te elementy z A +, w wyniku pożądaną wydajność: "This+is+my+string".

Aaron Brager
źródło
0

Zaimplementowałem tę bardzo prostą funkcję:

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

Możesz więc napisać:

let sqlQuery = "INSERT INTO myTable (Field1, Field2) VALUES ('\(convap(value1))','\(convap(value2)')
Blasco73
źródło
0

możesz to przetestować:

niech newString = test.stringByReplacingOccurrencesOfString („”, withString: „+”, opcje: zero, zakres: zero)

Haya Hashmat
źródło
-1

Oto rozszerzenie metody zastępowania wystąpień w miejscu String, która nie eliminuje zbędnej kopii i robi wszystko na swoim miejscu:

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

(Podpis metody naśladuje również podpis wbudowanej String.replacingOccurrences()metody)

Można użyć w następujący sposób:

var string = "this is a string"
string.replaceOccurrences(of: " ", with: "_")
print(string) // "this_is_a_string"
Stéphane Copin
źródło
Zaktualizowałem kod, aby zapobiec nieskończonym pętlom, jeśli zawarty tekst był zawarty w tekście docelowym.
Stéphane Copin