如何从Swift 2中的字符串中删除特殊字符?

Har*_*360 32 string ios swift

如何从字符串中删除特殊字符的答案 不管用.

这是我得到的,它给了我一个错误

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
}
Run Code Online (Sandbox Code Playgroud)

$ 0处的错误表示_Element(aka Character)无法转换为预期的参数类型'String'.

mat*_*att 55

像这样:

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

以下是测试方法:

let s = removeSpecialCharsFromString("père") // "pre"
Run Code Online (Sandbox Code Playgroud)


Mak*_*zev 23

SWIFT 4:

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

更清洁的方式:

extension String {

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

使用此扩展名如:

let myCleanString = "some.Text@#$".stripped
Run Code Online (Sandbox Code Playgroud)

输出:"some.Text"


Bis*_*sca 12

我认为更清洁的解决方案可能是这种方法:

extension String {
    var alphanumeric: String {
        return self.components(separatedBy: CharacterSet.alphanumerics.inverted).joined().lowercased()
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

尝试这个:

someString.removeAll(where: {$0.isPunctuation})
Run Code Online (Sandbox Code Playgroud)

  • 在回答时,如果您提供一些解释为什么这是合适的解决方案及其工作原理,那么对OP以及将来寻找类似解决方案的任何其他人都会更有帮助。 (4认同)

Mar*_*n R 6

Swift 1.2中,

let chars = Set("abcde...")
Run Code Online (Sandbox Code Playgroud)

创建了一个包含给定字符串中所有字符的集合.在Swift 2.0中,必须这样做

let chars = Set("abcde...".characters)
Run Code Online (Sandbox Code Playgroud)

原因是字符串本身不再符合 SequenceType,您必须characters明确使用视图.

通过该更改,您的方法可以按预期编译和工作:

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
Run Code Online (Sandbox Code Playgroud)

备注: @Kametrixom建议只创建一次.因此,如果上述方法存在性能问题,您可以将该集的声明移到函数外部,或者将其设置为本地static:

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

  • 我建议在函数外部移动`chars`的声明,因为每次调用函数时都可以创建它 (2认同)