Swift Stringの文字を置き換える方法はありますか?


回答:


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

または、NSStringからのAPIを利用しない、より迅速なソリューションを探している場合は、これを使用できます。

let aString = "Some search text"

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

9
オプション範囲パラメータはオプションです
cprcrack

1
stringByReplacingOccurrencesOfStringの素晴らしいswift2置換
rjb101

私が何か間違っているのかどうかはわかりませんが、2番目のSwift 2.0ソリューションではオプションの文字列が残っています。元の文字列は次のようになります。"x86_64"新しいマッピングは次のようになります"Optional([\"x\", \"8\", \"6\", \"_\", \"6\", \"4\"])"
John Shelley

7
stringByReplacingOccurrencesOfStringSwift 2 での使用に問題import Foundationがあった場合は、その方法を使用できる必要があります。
Liron Yahdav、2015年

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
これは変数を変更することを示唆しているため、関数に「replace」という名前は付けません。Appleと同じ文法を使用します。これを「replaceing(_:withString :)」と呼ぶと、より明確になります。将来変化する "replace"関数も名前付けで競合します。
Sunkas

57

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

これがこの質問に対する答えです。
Bijender Singh Shekhawat

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

Sunkasの方針に沿ったSwift 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

ラミスの回答に基づく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の命名規則に従って、適切な関数名を考え出そうとしました。


これは、複数の文字を一度に置き換えることができるため、私の推奨ソリューションです。
焼却炉

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

Swiftは、ほとんどすべてに異なる用語を使用するために、その道を離れます。その他のほとんどすべての言語replace
javadba

2
var str = "This is my string"
str = str.replacingOccurrences(of: " ", with: "+")
print(str)

なぜ見つけreplacingOccurrencesられないのStringですか?
javadba

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

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、1つのパスで配列を渡して、複数の置換を行うことができます。


1

Swift 3の例を次に示します。

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

1

これはSwift 4.2では簡単です。replacingOccurrences(of: " ", with: "_")交換に使用するだけ

var myStr = "This is my string"
let replaced = myStr.replacingOccurrences(of: " ", with: "_")
print(replaced)

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
これはすばらしい小さな情報です。レオに感謝!
Peter

0

Objective-C NSStringメソッドを使用したくない場合はsplit、andを使用するだけです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

次に、インプレースオカレンスのreplaceメソッドの拡張機能を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"

含まれているテキストがターゲットテキストに含まれている場合に無限ループが発生しないようにコードを更新しました。
ステファンCopin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.