Swift – 如何在不从字符串中删除表情符号的情况下删除特殊字符?

Swift – How to remove special character without remove emoji from string?

如何在不删除表情符号的情况下从字符串中删除所有特殊字符?

我试过:

func removeSpecialCharsFromString(text: String) -> String {
    let okayChars : Set<Character> = 
        Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890-& ".characters)
    return String(text.characters.filter {okayChars.contains([=11=]) })
}

– 但此函数还会从字符串中删除表情符号。

预期结果:

"Hello guys !? Need some money $ "

实际结果:

"Hello guys Need some money "

这里的问题是如何判断一个字符是不是表情符号。 Swift 有一个方便的 isEmoji 方法,我们可以使用。

这是使用 isEmoji 方法更新后的函数:

func removeSpecialCharacters(from text: String) -> String {
    let okayChars = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890-& ")
    return String(text.unicodeScalars.filter { okayChars.contains([=10=]) || [=10=].properties.isEmoji })
}

以防万一有人要在 Playground 中测试上面的代码:

let input = "Hello guys !? Need some money $ "
let output = removeSpecialCharacters(from: input)
print(output)                    // Prints: Hello guys  Need some money  

您可以使用下面的扩展来使您的句子按照所需的输出变得完美。

extension String {
    var condensedWhitespace: String {
        let components = self.components(separatedBy: NSCharacterSet.whitespacesAndNewlines)
        return components.filter { ![=10=].isEmpty }.joined(separator: " ")
    }

    func removeSpecialCharacters() -> String {
        let okayChars = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890 ")
        return String(self.unicodeScalars.filter { okayChars.contains([=10=]) || [=10=].properties.isEmoji })
    }
}

示例。

let input = "Hello guys !? Need some money $ "

print(input.removeSpecialCharacters().condensedWhitespace)
// Hello guys Need some money