简体   繁体   中英

How to remove special characters from string in Swift 2?

The answer in How to strip special characters out of string? is not working.

Here is what I got and it gives me an error

func removeSpecialCharsFromString(str: String) -> String {
    let chars: Set<String> = Set(arrayLiteral: "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-*=(),.:!_")

    return String(str.characters.filter { chars.contains($0) }) //error here at $0
}

The error at $0 says

_Element (aka Character) cannot be converted to expected argument type 'String'.

Like this:

func removeSpecialCharsFromString(text: String) -> String {
    let okayChars : Set<Character> = 
        Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-*=(),.:!_".characters)
    return String(text.characters.filter {okayChars.contains($0) })
}

And here's how to test:

let s = removeSpecialCharsFromString("père") // "pre"

SWIFT 4:

func removeSpecialCharsFromString(text: String) -> String {
    let okayChars = Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-=().!_")
    return text.filter {okayChars.contains($0) }
}

More cleaner way:

extension String {

    var stripped: String {
        let okayChars = Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-=().!_")
        return self.filter {okayChars.contains($0) }
    }
}

Use this extension like:

let myCleanString = "some.Text@#$".stripped

Output: "some.Text"

I think that a cleaner solution could be this approach:

extension String {
    var alphanumeric: String {
        return self.components(separatedBy: CharacterSet.alphanumerics.inverted).joined().lowercased()
    }
}

In Swift 1.2,

let chars = Set("abcde...")

created a set containing all characters from the given string. In Swift 2.0 this has to be done as

let chars = Set("abcde...".characters)

The reason is that a string itself does no longer conform to SequenceType , you have to use the characters view explicitly.

With that change, your method compiles and works as expected:

func removeSpecialCharsFromString(str: String) -> String {
    let chars = Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-*=(),.:!_".characters)
    return String(str.characters.filter { chars.contains($0) })
}

let cleaned = removeSpecialCharsFromString("ab€xy")
print(cleaned) // abxy

Remark: @Kametrixom suggested to create the set only once. So if there is performance issue with the above method you can either move the declaration of the set outside of the function, or make it a local static :

func removeSpecialCharsFromString(str: String) -> String {
    struct Constants {
        static let validChars = Set("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890+-*=(),.:!_".characters)
    }
    return String(str.characters.filter { Constants.validChars.contains($0) })
}

尝试这个:

someString.removeAll(where: {$0.isPunctuation})

If you need to keep only ascii printable characters in a string you can just filter them checking if their unicodeScalar values are ascii:

extension Character {
    var isAscii: Bool {
        return unicodeScalars.allSatisfy { $0.isASCII }
    }
}

extension RangeReplaceableCollection where Self: StringProtocol {
    var asciiPrintable: Self {
        return filter { $0.isAscii }
    }
}

let string = "cafe\u{301}"
let asciiPrintable = string.asciiPrintable
print(asciiPrintable)  // "caf"

without removing spaces between words

extension String {
    var removeSpecialCharacters: String {
        return self.components(separatedBy: CharacterSet.alphanumerics.inverted).filter({ !$0.isEmpty }).joined(separator: " ")
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM