Home > Net >  Swift 5 - Error with the password validation regex
Swift 5 - Error with the password validation regex

Time:07-14

I am making a sign-in/up function on Swift. I am trying to validate a password using regex. The passwords have the following requirements

  • At least 7 characters long
  • At least one uppercase letter
  • At least one number

This is the validation regex I was using: "^(?=.[A-Z])(?=.[0-9]){7}$"

And this is my code

let passwordTest = NSPredicate(format: "SELF MATCHES %@", "^(?=.[A-Z])(?=.[0-9]){7}$")

Whenever I try to log in with a password that meets these requirements (eg. Greatpass13), Xcode gives me an error saying

Thread 1: "Can't do regex matching, reason: (Can't open pattern U_REGEX_RULE_SYNTAX (string Greatpass13, pattern ^(?=.[A-Z])(?=.[0-9]){7}$, case 0, canon 0))"

CodePudding user response:

(?=^.{7,}$)(?=^.*[A-Z].*$)(?=^.*\d.*$).*

Short Explanation

  • (?=^.{7,}$) At least 7 characters long
  • (?=^.*[A-Z].*$) At least one uppercase letter
  • (?=^.*\d.*$) At least one number
  • .* Match the string that contains all assertions

See the regex demo

Swift Example

let phonePattern = #"(?=^.{7,}$)(?=^.*[A-Z].*$)(?=^.*\d.*$).*"#

func isValid(password: String) -> Bool {
    return password.range(
        of: phonePattern,
        options: .regularExpression
    ) != nil
}

print(isValid(password: "Pass1"))       // false
print(isValid(password: "Pass23word"))  // true
print(isValid(password: "23password"))  // false
print(isValid(password: "Greatpass13")) // true

CodePudding user response:

you forgot to add dot before counter 7

func isValidPassword() -> Bool {
        let password = self.trimmingCharacters(in: CharacterSet.whitespaces)
        let passwordRegx = "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9]).{7}$"
        let passwordCheck = NSPredicate(format: "SELF MATCHES %@",passwordRegx)
        return passwordCheck.evaluate(with: password)
 }

at least one uppercase,

at least one digit

at least one lowercase

min 7 characters total

CodePudding user response:

Here is the updated regex based on yours.

let passwordRegx = "^(?=.*?[A-Z])(?=.*?[0-9]).{7,}$"
let passwordPredicate = NSPredicate(format: "SELF MATCHES %@",passwordRegx)

Also you need to add {7,} at the end otherwise it will only match for 7 characters and not more than that.

You can test your regex at: https://regex101.com/

  • Related