Swift String에서 문자를 바꾸는 방법은 무엇입니까?


474

Swift에서 문자를 바꾸는 방법을 찾고 String있습니다.

예 : "이것은 내 문자열입니다"

"This + is + my + 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에서 언급했듯이 optionsrange매개 변수는 선택 사항이므로 문자열 비교 옵션이나 범위 내에서 교체를 수행하지 않으려는 경우 다음이 필요합니다.

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를 사용하지 않는 Swifty 솔루션을 찾고 있다면 이것을 사용할 수 있습니다.

let aString = "Some search text"

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

9
옵션범위 매개 변수는 선택
cprcrack

1
stringByReplacingOccurrencesOfString에 대한 swift2 대체
rjb101

내가 잘못하고 있는지 모르겠지만 두 번째 swift 2.0 솔루션은 나를 옵션 문자열로 남겨 둡니다. 원래 문자열은 다음과 같습니다. "x86_64"새로운 매핑은 다음과 같습니다"Optional([\"x\", \"8\", \"6\", \"_\", \"6\", \"4\"])"
John Shelley

7
stringByReplacingOccurrencesOfStringSwift 2에서 사용하는 데 문제가있는 사람은 import Foundation해당 방법을 사용할 수 있어야합니다.
Liron Yahdav

1
와우, stringByReplacingOccurrencesOfString, 얼마나 직관적! makeNewStringByReplacecingOccurrencesOfFirstArgumentByValueInSecondArgument
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과 동일한 문법을 ​​사용하십시오. "replacing (_ : withString :)"이라고 부르면 훨씬 더 명확 해집니다. 향후 변경 "바꾸기"기능도 이름이 충돌합니다.
Sunkas

57

스위프트 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: "+")

이것이이 질문에 대한 답변입니다.
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

Ramis의 답변을 기반으로 한 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

스위프트 확장 :

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

1

이것은 빠른 4.2에서는 쉽습니다. 그냥 replacingOccurrences(of: " ", with: "_")교체에 사용

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

1

Xcode 11 • 스위프트 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 Suwara

0

Objective-C NSString메소드 를 사용하지 않으려면 splitand를 사용하면됩니다 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"

포함 된 텍스트가 대상 텍스트에 포함 된 경우 무한 루프를 방지하기 위해 코드를 업데이트했습니다.
Stéphane Copin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.