Ios 使用正则表达式进行Xcode/swift密码验证

Ios 使用正则表达式进行Xcode/swift密码验证,ios,regex,swift,xcode,Ios,Regex,Swift,Xcode,我刚刚听说了这个正则表达式,正在努力让它发挥作用 我的代码: func isPasswordValid(_ Password : String) -> Bool{ let Password = NSPredicate(format: "SELF MATCHES %@", "^(?=.*[A-Z](?=.*[0-9].{>8}$") return Password.evaluate(with: Password) } @IBAction func Register(_

我刚刚听说了这个正则表达式,正在努力让它发挥作用

我的代码:

func isPasswordValid(_ Password : String) -> Bool{
    let Password = NSPredicate(format: "SELF MATCHES %@", "^(?=.*[A-Z](?=.*[0-9].{>8}$")
    return Password.evaluate(with: Password)
}

@IBAction func Register(_ sender: UIButton) {
    if Username.text == "" {
        Error.text = "Email må ikke være tom";
    }
    if Username.text != "" {
        Error.text = ""
    }
    if Password.text == "" {
        Error2.text = "Password må ikke være tom"
    }
    if Password.text != "" {
        Error2.text = ""
    }
    if Password.text != repeatPassword.text || repeatPassword.text == "" {
        Error3.text = "Password skal være det samme"
    }
    if Password.text == repeatPassword.text && repeatPassword.text != "" {
        Error3.text = ""
    }
    if Password.text! == repeatPassword.text && Username.text != "" {
        Auth.auth().createUser(withEmail: Username.text!, password: Password.text!) { (User, Error) in
            self.performSegue(withIdentifier: "goToSignIn", sender: self)
        }
    }

}
当我运行它时,它会在返回状态下生成一个断点。我想我需要点什么? 有人能帮忙吗

func isPasswordValid(_ Password : String) -> Bool{
    let Password = NSPredicate(format: "SELF MATCHES %@", "^(?=.*[A-Z](?=.*[0-9].{>8}$")
    return Password.evaluate(with: Password)
}
我怀疑您的函数参数与谓词变量名冲突,请尝试以下操作:

func isPasswordValid(_ password : String) -> Bool{
    let predicate = NSPredicate(format: "SELF MATCHES %@", "^(?=.*[A-Z](?=.*[0-9].{>8}$")
    return predicate.evaluate(with: password)
}

@IBAction func Register(_ sender: UIButton) {

    let username = self.username.text.flatMap { $0.isEmpty ? nil : $0 }
    let password = self.password.text.flatMap { $0.isEmpty ? nil : $0 }
    let repeat = self.repeatPassword.text.flatMap { $0 == password }

    error.text = username == nil ? "Email må ikke være tom" : ""
    error2.text = password == nil ? "Password må ikke være tom" : ""
    error3.text = repeatPassword == nil ? "Password skal være det samme" : ""

    guard username != nil, repeat != nil else { return }

    Auth.auth().createUser(withEmail: username!, password: password!) { (user, error) in
        self.performSegue(withIdentifier: "goToSignIn", sender: self)
    }
}
我怀疑您的函数参数与谓词变量名冲突,请尝试以下操作:

func isPasswordValid(_ password : String) -> Bool{
    let predicate = NSPredicate(format: "SELF MATCHES %@", "^(?=.*[A-Z](?=.*[0-9].{>8}$")
    return predicate.evaluate(with: password)
}

@IBAction func Register(_ sender: UIButton) {

    let username = self.username.text.flatMap { $0.isEmpty ? nil : $0 }
    let password = self.password.text.flatMap { $0.isEmpty ? nil : $0 }
    let repeat = self.repeatPassword.text.flatMap { $0 == password }

    error.text = username == nil ? "Email må ikke være tom" : ""
    error2.text = password == nil ? "Password må ikke være tom" : ""
    error3.text = repeatPassword == nil ? "Password skal være det samme" : ""

    guard username != nil, repeat != nil else { return }

    Auth.auth().createUser(withEmail: username!, password: password!) { (user, error) in
        self.performSegue(withIdentifier: "goToSignIn", sender: self)
    }
}

{>8}
在正则表达式中无效,请改用:

let Password = NSPredicate(format: "SELF MATCHES %@", "^(?=.*[A-Z])(?=.*[0-9]).{8,}$")
#                                               close lookahead __^       __^ ^^^^^

{>8}
在正则表达式中无效,请改用:

let Password = NSPredicate(format: "SELF MATCHES %@", "^(?=.*[A-Z])(?=.*[0-9]).{8,}$")
#                                               close lookahead __^       __^ ^^^^^
斯威夫特5

func isValidPassword(_ password:String) -> Bool {
   if(password.count > 7 && password.count < 17) {
   } else {
       return false
   }
   let nonUpperCase = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZ").inverted
   let letters = password.components(separatedBy: nonUpperCase)
   let strUpper: String = letters.joined()

   let smallLetterRegEx  = ".*[a-z]+.*"
   let samlltest = NSPredicate(format:"SELF MATCHES %@", smallLetterRegEx)
   let smallresult = samlltest.evaluate(with: password)

   let numberRegEx  = ".*[0-9]+.*"
   let numbertest = NSPredicate(format:"SELF MATCHES %@", numberRegEx)
   let numberresult = numbertest.evaluate(with: password)

   let regex = try! NSRegularExpression(pattern: ".*[^A-Za-z0-9].*", options: NSRegularExpression.Options())
   var isSpecial :Bool = false
   if regex.firstMatch(in: password, options: NSRegularExpression.MatchingOptions(), range:NSMakeRange(0, password.count)) != nil {
    print("could not handle special characters")
       isSpecial = true
   }else{
       isSpecial = false
   }
   return (strUpper.count >= 1) && smallresult && numberresult && isSpecial
}
func isValidPassword(u密码:String)->Bool{
如果(password.count>7&&password.count<17){
}否则{
返回错误
}
让非大写=字符集(字符sin:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”)。反转
让字母=password.components(分隔符:非大写)
让strUpper:String=letters.joined()
设smalllettergex=“.[a-z]+.*”
让samlltest=NSPredicate(格式:“自匹配%@”,smalllettergex)
让smallresult=samlltest.evaluate(使用:密码)
让numberRegEx=“.[0-9]+.*”
让numbertest=NSPredicate(格式:“自匹配%@”,numberRegEx)
让numberresult=numbertest.evaluate(使用:密码)
让regex=try!NSRegularExpression(模式:“.[^A-Za-z0-9].*”,选项:NSRegularExpression.options())
var isSpecial:Bool=false
如果regex.firstMatch(in:password,options:NSRegularExpression.MatchingOptions(),range:NSMakeRange(0,password.count))!=nil{
打印(“无法处理特殊字符”)
isSpecial=true
}否则{
isSpecial=假
}
返回值(strUpper.count>=1)&&smallresult&&numberresult&&isSpecial
}
Swift 5

func isValidPassword(_ password:String) -> Bool {
   if(password.count > 7 && password.count < 17) {
   } else {
       return false
   }
   let nonUpperCase = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZ").inverted
   let letters = password.components(separatedBy: nonUpperCase)
   let strUpper: String = letters.joined()

   let smallLetterRegEx  = ".*[a-z]+.*"
   let samlltest = NSPredicate(format:"SELF MATCHES %@", smallLetterRegEx)
   let smallresult = samlltest.evaluate(with: password)

   let numberRegEx  = ".*[0-9]+.*"
   let numbertest = NSPredicate(format:"SELF MATCHES %@", numberRegEx)
   let numberresult = numbertest.evaluate(with: password)

   let regex = try! NSRegularExpression(pattern: ".*[^A-Za-z0-9].*", options: NSRegularExpression.Options())
   var isSpecial :Bool = false
   if regex.firstMatch(in: password, options: NSRegularExpression.MatchingOptions(), range:NSMakeRange(0, password.count)) != nil {
    print("could not handle special characters")
       isSpecial = true
   }else{
       isSpecial = false
   }
   return (strUpper.count >= 1) && smallresult && numberresult && isSpecial
}
func isValidPassword(u密码:String)->Bool{
如果(password.count>7&&password.count<17){
}否则{
返回错误
}
让非大写=字符集(字符sin:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”)。反转
让字母=password.components(分隔符:非大写)
让strUpper:String=letters.joined()
设smalllettergex=“.[a-z]+.*”
让samlltest=NSPredicate(格式:“自匹配%@”,smalllettergex)
让smallresult=samlltest.evaluate(使用:密码)
让numberRegEx=“.[0-9]+.*”
让numbertest=NSPredicate(格式:“自匹配%@”,numberRegEx)
让numberresult=numbertest.evaluate(使用:密码)
让regex=try!NSRegularExpression(模式:“.[^A-Za-z0-9].*”,选项:NSRegularExpression.options())
var isSpecial:Bool=false
如果regex.firstMatch(in:password,options:NSRegularExpression.MatchingOptions(),range:NSMakeRange(0,password.count))!=nil{
打印(“无法处理特殊字符”)
isSpecial=true
}否则{
isSpecial=假
}
返回值(strUpper.count>=1)&&smallresult&&numberresult&&isSpecial
}

正则表达式/验证应该做什么?请遵守变量名以小写字母开头的命名约定。正则表达式/验证应该做什么?请遵守变量名以小写字母开头的命名约定。看起来它现在正在工作。但是,如果您查看我的最后几行代码。在if语句中,我确保所有内容都已填写且密码相同。我该怎么写才能确认呢?@JonasLarsen我已经更新了我的答案来更新注册方法,看起来它现在正在工作。但是,如果您查看我的最后几行代码。在if语句中,我确保所有内容都已填写且密码相同。我该怎么写才能确认呢?@JonasLarsen我已经更新了我的答案来更新注册方法哦,好吧,那么现在它至少有8个字符了?@JonasLarsen:是的。很好,现在我只需要在运行最后一个if语句之前澄清它是真的,有什么想法吗?哦,好吧,那么现在它至少有8个字符了?@JonasLarsen:是的。很好,现在我只需要在运行最后一个if语句之前澄清它是真的,有什么想法吗?