ios - 尝试确保方法检查 Swift 中的字母和连字符

标签 ios regex swift nsstring

我有一个方法,如果接收到的字符串值包含大写/小写字符或连字符的任意组合,则返回 bool 值 true,如果包含任何数字或特殊字符,则返回 false (即包含上述字符集之外的任何内容)。不幸的是,我有以下方法没有这样做:

let alphaCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-"

        if self.isNameValid("joe-bYlow") {
            print("correct")
        } //passes

        if self.isNameValid("YYYYY") {
            print("correct")
        } //passes

        if self.isNameValid("8888ja;sdf") {
            print ("wrong")
        } //fails i.e. it prints "wrong"

        if self.isNameValid("__^&^%%%jdjjd") {
            print ("wrong")
        } //fails i.e. it prints "wrong"

        if self.isNameValid("9999") {
            print("also wrong")
        } //passes

        if self.isNameValid("blahBlah8") {
            print("wrong")
        } //fails i.e. it prints "wrong"

        if self.isNameValid("Frank") {
            print("correct")
        } //passes

    func isNameValid(name: String) -> Bool {
        let characterSetAllowed = NSCharacterSet(charactersInString: alphaCharacters)
        if let _ = name.rangeOfCharacterFromSet(characterSetAllowed, options: .CaseInsensitiveSearch) {
            return true
        } else {
            return false
        }
    }

谁能看出我做错了什么?

最佳答案

您的解决方案非常接近正确。您方法中的逻辑是检查名称中的任何字符是否为字母字符。

对于字符串 __^&^%%%jdjjdrangeOfCharacterFromSet 返回它在集合中找到的第一个字符的范围。因此它返回第一个 j 的范围 {8, 1}

那么我们如何检查字符串中的ALL 字符呢?您可以遍历每个字符,但这看起来工作量很大。

我的解决方案是获取您不需要的一组字符,然后检查该组中没有任何字符。

func isNameValid(name: String) -> Bool {
    let characterSetNotAllowed = NSCharacterSet(charactersInString: alphaCharacters).invertedSet
    if let _ = name.rangeOfCharacterFromSet(characterSetNotAllowed, options: .CaseInsensitiveSearch) {
        return false
    } else {
        return true
    }
}

另外,感谢您将您的代码放在一个可以轻松放入 Playground 中以显示问题的表单中。这使得查找原因变得非常容易。

关于ios - 尝试确保方法检查 Swift 中的字母和连字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38623469/

相关文章:

ios - 如何在 Xcode 中使用 SFPro 字体部署目标 9.3?

ios - 使用 @property ivars 的最佳实践

regex - PowerShell正则表达式可过滤{{和}}之间的值

java - 使用 RegEx 从 java 字符串中删除除 - 和 _ 之外的所有标点符号

swift - 编写一个类作为辅助服务并从另一个类调用它

ios - 如何使用宽度和字体大小获取字符串高度?

iOS - Interface Builder - 自动布局两个标签

ios - 如何修改 MVVM Cross 中的绑定(bind)值

ios - Swift:无法将类型 '() -> Bool' 的值转换为预期的参数类型 'PFObject'

regex - bash 替换用包含关键字的标记分隔的部分文本