有啥方法可以替换 Swift String 上的字符?

Posted

技术标签:

【中文标题】有啥方法可以替换 Swift String 上的字符?【英文标题】:Any way to replace characters on Swift String?有什么方法可以替换 Swift String 上的字符? 【发布时间】:2014-06-13 08:28:39 【问题描述】:

我正在寻找一种方法来替换 Swift String 中的字符。

示例:“这是我的字符串”

我想把“”换成“+”得到“This+is+my+string”。

我怎样才能做到这一点?

【问题讨论】:

Swift Extension 【参考方案1】:

此答案已针对 Swift 4 和 5 进行了更新。如果您仍在使用 Swift 1、2 或 3,请查看修订历史记录。

您有几个选择。您可以使用as @jaumard suggested 并使用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
)

【讨论】:

optionsrange 参数是可选的 stringByReplacingOccurrencesOfString 的 swift2 替代品 我不知道我是否做错了,但第二个 swift 2.0 解决方案给我留下了可选字符串。原始字符串看起来像这样:"x86_64",新的映射看起来像 "Optional([\"x\", \"8\", \"6\", \"_\", \"6\", \"4\"])" 对于在 Swift 2 中使用 stringByReplacingOccurrencesOfString 时遇到问题的任何人,您需要 import Foundation 才能使用该方法。 哇,stringByReplacingOccurrencesOfString,多么直观!我期待类似 makeNewStringByReplacingOccurrencesOfFirstArgumentByValueInSecondArgument【参考方案2】:

你可以用这个:

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)
    

【讨论】:

我不会将函数命名为“replace”,因为这表明它会改变变量。使用与 Apple 相同的语法。称它为“替换(_:withString :)”会更清楚。未来的变异“替换”函数也会在命名上发生冲突。【参考方案3】:

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

【讨论】:

【参考方案4】:

你测试了吗:

var test = "This is my string"

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

【讨论】:

【参考方案5】:

我正在使用这个扩展:

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

【讨论】:

【参考方案6】:

斯威夫特 4:

let abc = "Hello world"

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

print(result :\(result))

输出:

result : Hello_world

【讨论】:

【参考方案7】:

一个类似于 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?

【讨论】:

【参考方案8】:
var str = "This is my string"

print(str.replacingOccurrences(of: " ", with: "+"))

输出是

This+is+my+string

【讨论】:

【参考方案9】:

修改现有可变字符串的类别:

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

【讨论】:

【参考方案10】:

基于Ramis' answer的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 命名约定想出一个合适的函数名。

【讨论】:

这是我的首选解决方案,因为它可以让您一次替换多个字符。【参考方案11】:

发生在我身上的事情较少,我只是想在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【参考方案12】:
var str = "This is my string"
str = str.replacingOccurrences(of: " ", with: "+")
print(str)

【讨论】:

为什么我在String 中找不到replacingOccurrences 确认你的变量类型是字符串【参考方案13】:

Xcode 11 • Swift 5.1

StringProtocolreplacingOccurrences的mutating方法可以实现如下:

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"

【讨论】:

这是一个很棒的小花絮。谢谢狮子座!【参考方案14】:

我认为 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"

【讨论】:

【参考方案15】:

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 的数组来进行多次替换。

【讨论】:

【参考方案16】:

这是 Swift 3 的示例:

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

【讨论】:

【参考方案17】:

这在 swift 4.2 中很容易。只需使用replacingOccurrences(of: " ", with: "_") 替换

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

【讨论】:

【参考方案18】:

如果你不想使用 Objective-C 的 NSString 方法,你可以使用 splitjoin

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"

【讨论】:

【参考方案19】:

我已经实现了这个非常简单的函数:

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

所以你可以写:

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

【讨论】:

【参考方案20】:

你可以测试一下:

让 newString = test.stringByReplacingOccurrencesOfString(" ", withString: "+", options: nil, range: nil)

【讨论】:

【参考方案21】:

从 Swift 2 开始,String 不再符合 SequenceType。换句话说,您不能使用 for...in 循环遍历字符串。

简单易行的方法是将String 转换为Array 以获取索引的好处,就像这样:

let input = Array(str)

我记得当我尝试在不使用任何转换的情况下对String 进行索引时。我真的很沮丧,因为我无法想出或达到预期的结果,并且即将放弃。 但我最终创建了自己的解决方案,这是扩展的完整代码:

extension String 
    subscript (_ index: Int) -> String 
    
        get 
             String(self[self.index(startIndex, offsetBy: index)])
        
    
        set 
            remove(at: self.index(self.startIndex, offsetBy: index))
            insert(Character(newValue), at: self.index(self.startIndex, offsetBy: index))
        
    

现在您可以使用它的索引从字符串中读取和替换单个字符,就像您最初想要的那样:

var str = "cat"
for i in 0..<str.count 
 if str[i] == "c" 
   str[i] = "h"
 


print(str)

使用它并通过 Swift 的字符串访问模型是一种简单而有用的方式。 现在你会觉得下次你可以按原样循环遍历字符串,而不是把它转换成Array

试一试,看看是否有帮助!

【讨论】:

【参考方案22】:

这是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"

【讨论】:

我已经更新了代码以防止在目标文本中包含包含的文本时出现无限循环。

以上是关于有啥方法可以替换 Swift String 上的字符?的主要内容,如果未能解决你的问题,请参考以下文章

String中的常用方法

java中有啥方法可以读取占位符的字符串,并且把占位符替换成参数

swift中有啥更好:一个函数返回一个变量或只是一个getter变量[重复]

有啥方法可以把手游里的图片提取出来,像galgame提取cg那样?

JAVA中appendReplacement()方法和replaceAll()方法有啥区别。。

怎么把照片上的字去掉?