Ios 检查字符串是否至少包含大写字母、数字或Swift中的特殊字符?

Ios 检查字符串是否至少包含大写字母、数字或Swift中的特殊字符?,ios,regex,swift,Ios,Regex,Swift,我正在尝试创建一个方法,使用下面的正则表达式来查找字符串是否包含数字、大写字母和特殊字符 func checkTextSufficientComplexity(var text : String) -> Bool{ let capitalLetterRegEx = "[A-Z]+" var texttest = NSPredicate(format:"SELF MATCHES %@", capitalLetterRegEx)

我正在尝试创建一个方法,使用下面的正则表达式来查找字符串是否包含数字、大写字母和特殊字符

 func checkTextSufficientComplexity(var text : String) -> Bool{


            let capitalLetterRegEx  = "[A-Z]+"
            var texttest = NSPredicate(format:"SELF MATCHES %@", capitalLetterRegEx)
            var capitalresult = texttest.evaluateWithObject("AniP")
            println("\(capitalresult)")


            let numberRegEx  = "[0-9]+"
            var texttest1 = NSPredicate(format:"SELF MATCHES %@", numberRegEx)
            var numberresult = texttest1.evaluateWithObject(text)
            println("\(numberresult)")


            let specialCharacterRegEx  = "[.*&^%$#@()/]+"
            var texttest2 = NSPredicate(format:"SELF MATCHES %@", numberRegEx)

            var specialresult = texttest2.evaluateWithObject(text)
            println("\(specialresult)")

           return capitalresult && numberresult && specialresult

    }

问题是下面的正则表达式[A-Z]+仅对化身返回true,对化身返回false。如果正则表达式至少包含一个大写字符串,我希望它返回true。

只需将正则表达式规则[A-Z]+替换为。*[A-Z]+.*(以及其他正则表达式规则)

规则

[A-Z]+只匹配所有字符都大写的字符串

示例:阿凡达、AVA、TAR、AAAA
不起作用:阿凡达

*匹配所有字符串(0个以上字符)

示例:1、2、化身、AVA、TAR、a、b、c

.*[A-Z]+.*将所有字符串与至少一个大写字母匹配

示例:化身,化身,化身

说明:

我…*将尝试匹配0个或更多项
二,。[A-Z]+至少需要一个大写字母(因为+)
三、 .*将尝试匹配0个或更多项

阿凡达[空的|“A”|“瓦塔”]
阿凡达[“a”|“V”|“atar”]
阿凡达[“a”|“VA”|“tar”]

工作代码

func checkTextSufficientComplexity(var text : String) -> Bool{


    let capitalLetterRegEx  = ".*[A-Z]+.*"
    var texttest = NSPredicate(format:"SELF MATCHES %@", capitalLetterRegEx)
    var capitalresult = texttest!.evaluateWithObject(text)
    println("\(capitalresult)")


    let numberRegEx  = ".*[0-9]+.*"
    var texttest1 = NSPredicate(format:"SELF MATCHES %@", numberRegEx)
    var numberresult = texttest1!.evaluateWithObject(text)
    println("\(numberresult)")


    let specialCharacterRegEx  = ".*[!&^%$#@()/]+.*"
    var texttest2 = NSPredicate(format:"SELF MATCHES %@", specialCharacterRegEx)

    var specialresult = texttest2!.evaluateWithObject(text)
    println("\(specialresult)")

    return capitalresult || numberresult || specialresult

}
示例:

checkTextSufficientComplexity("Avatar") // true || false || false
checkTextSufficientComplexity("avatar") // false || false || false
checkTextSufficientComplexity("avatar1") // false || true || false
checkTextSufficientComplexity("avatar!") // false || false || true

这里是Swift 3中Joshuas答案的简明版本,假设必须完成所有验证

func validate(password: String) -> Bool {
    let capitalLetterRegEx  = ".*[A-Z]+.*"
    let texttest = NSPredicate(format:"SELF MATCHES %@", capitalLetterRegEx)
    guard texttest.evaluate(with: password) else { return false }

    let numberRegEx  = ".*[0-9]+.*"
    let texttest1 = NSPredicate(format:"SELF MATCHES %@", numberRegEx)
    guard texttest1.evaluate(with: password) else { return false }

    let specialCharacterRegEx  = ".*[!&^%$#@()/_*+-]+.*"
    let texttest2 = NSPredicate(format:"SELF MATCHES %@", specialCharacterRegEx)
    guard texttest2.evaluate(with: password) else { return false }

    return true
}

另一种替代解决方案

可以使用一个正则表达式执行所有检查

RegExp: ^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,}
您可以使用以下内容:

//Minimum 8 characters at least 1 Uppercase Alphabet, 1 Lowercase Alphabet, 1 Number and 1 Special Character:
let regex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,}"
let isMatched = NSPredicate(format:"SELF MATCHES %@", regex).evaluate(with: yourTextField.text)
if(isMatched  == true) {
    // Do your stuff ..
}  else {
    // Show Error Message.
}

至少1个大写、1个小写、1个特殊字符、1个数字,总共8个字符。

支持中列出的所有特殊字符

!!“#$%&'()*+,-./:?@[]^{124;}~

extension String {
    func isValidPassword() -> Bool {
        //let passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[ !\"\\\\#$%&'()*+,-./:;<=>?@\\[\\]^_`{|}~])[A-Za-z\\d !\"\\\\#$%&'()*+,-./:;<=>?@\\[\\]^_`{|}~]{8,}"
        //safe to escape all regex chars
        let passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[ !\"\\\\#$%&'\\(\\)\\*+,\\-\\./:;<=>?@\\[\\]^_`\\{|\\}~])[A-Za-z\\d !\"\\\\#$%&'\\(\\)\\*+,\\-\\./:;<=>?@\\[\\]^_`\\{|\\}~]{8,}"
        return NSPredicate(format: "SELF MATCHES %@", passwordRegex).evaluate(with: self)
    }
}
扩展字符串{
func isValidPassword()->Bool{
//让passwordRegex=“^(?=.[a-z])(?=.[a-z])(?=.*\\d)(?=.[!”\\\\\\\\\\\\\\\\\$%&'()*+,-./:;?\\\\\[\]^{124}])[a-Za-z\\d!“\\\\\\\\\\\\\\\\\\\\\\\\%&'()*+,-./:?\\\\\\\\\\\\\\\\\\\\\]^{8,}”
//安全逃脱所有正则表达式字符
设passwordRegex=“^(?=.[a-z])(?=.[a-z])(?=..[!\“\\\\\\\\\\\\\\\\\\$%”和'\\\(\\\\\\\\\\\.\\\\./:;?\\\[\]^\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\++,\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
返回NSPredicate(格式:“SELF MATCHES%@”,passwordRegex)。评估(使用:SELF)
}
}

我认为
evaluateWithObject
试图匹配整个字符串。请尝试使用类似以下内容:
^.*.[A-Z].*?$
。我不明白。你能详细说明一下这个正则表达式吗?可能是
evaluateWithObject
函数调用试图匹配整个字符串,因此,给定这样的字符串:
Hello123
,以及这样的正则表达式:
[a-Z]+
,斯威夫特正在将它映射到这样的东西:
^[A-Z]+$
。这意味着它将期望提供的整个字符串完全匹配。请尝试进行更改,如果它有效,我将发布一个包含更多信息的答案。我不是一个快速开发人员,因此我可能错了,这就是我将此作为注释发布的原因。感谢您的解释。但它不起作用:(是在同一项上仍然失败,还是整个方法都失败了?照此,你的方法仍然应该返回假阴性。注意:如果你需要应用所有规则,简单地将| |替换为&&你知道这不起作用…所有三个结果都是真的…尽管我只插入数字…因为。*匹配所有字符串..我有一些输入错误。)n原始代码,如texttest.evaluateWithObject(“AniP”),并应替换为texttest.evaluateWithObject(text),以便它计算参数。texttest2还使用数字RegEx(它应使用特殊字符RegEx):)这就是为什么所有三个结果的计算结果都为true的原因,因为第一个表达式的计算结果始终为true,而第二个和第三个表达式的计算结果相同thing@anishparajuli没问题!好多了…谢谢你这个正则表达式在Swift 5中对我更有效。@Patrick R的那个似乎不起作用。啊,难以捉摸的神秘自然正则表达式的e再次混淆了你是山羊