Reputation: 939
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'.
Upvotes: 53
Views: 57971
Reputation: 11
without removing spaces between words
extension String {
var removeSpecialCharacters: String {
return self.components(separatedBy: CharacterSet.alphanumerics.inverted).filter({ !$0.isEmpty }).joined(separator: " ")
}
}
Upvotes: 0
Reputation: 535304
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"
Upvotes: 79
Reputation: 6763
I think that a cleaner solution could be this approach:
extension String {
var alphanumeric: String {
return self.components(separatedBy: CharacterSet.alphanumerics.inverted).joined().lowercased()
}
}
Upvotes: 27
Reputation: 3932
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"
Upvotes: 52
Reputation: 539795
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) })
}
Upvotes: 8