有没有一种方法可以在Swift字符串中替换字符?

587
我正在寻找一种方法来替换Swift中的字符String
例如:"This is my string"
我想将" "替换为"+",以便得到"This+is+my+string"。
我该如何实现?

Swift Extension - Juan Boero
24个回答

1

我认为正则表达式是最灵活和可靠的方式:

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 5.5

但这也可能适用于早期版本。

我经常进行替换,因为我想用 _ 或类似的东西替换“任何空格或 - ”。这个字符串扩展让我可以做到这一点。

extension String {
    func removingCharacters(_ characters:CharacterSet) -> Self {
        Self(self.unicodeScalars.filter {
            !characters.contains($0)
        })
    }
    func removingCharacters(in string:String) -> Self {
        Self(self.unicodeScalars.filter {
            !CharacterSet(charactersIn:string).contains($0)
        })
    }
    
    func replacingCharacters(_ characters:CharacterSet, with newChar:Character) -> Self {
        String(self.compactMap( {
            CharacterSet(charactersIn: "\($0.1)").isSubset(of: characters)
             ? newChar : $0.1
        }))
    }
    
    func replacingCharacters(in string:String, with newChar:Character) -> Self {
        String(self.compactMap( {
            CharacterSet(charactersIn: "\($0)").isSubset(of: CharacterSet(charactersIn:string))
             ? newChar : $0
        }))
    }
}

用法:

print("hello \n my name\t is Joe".removingCharacters(.whitespacesAndNewlines))
print("hello \n my name\t is Joe".removingCharacters(in: " \t\n"))

print("ban annan anann ana".replacingCharacters(.whitespacesAndNewlines, with: "_"))
print("ban-annan anann ana".replacingCharacters(in: " -", with: "_"))

显然,对于单个字符来说,.replacingOccurrences(of: " ", with: "+") 更好。

我还没有进行性能比较。

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

样式在Ramis的扩展中完成。如果有人做了,我会感兴趣。

另请参阅替换表情符号:https://dev59.com/1pbfa4cB1Zd3GeqPvY0f#63416058


0

如果您不想使用 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"


0

你可以测试一下:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接