I am trying to create a method that finds whether a string contains a number , Upper case letter and a special character using regular expression as below
func
Another alternate solution.
You can do all the check using one regular expression.
RegExp: ^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,}
You can use this as mention below:
//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.
}
At least 1 Uppercase, 1 Lowercase, 1 Special Characters, 1 Number, and Total 8 Characters.
To support all special characters listed in https://www.owasp.org/index.php/Password_special_characters
!"#$%&'()*+,-./:;<=>?@[]^_`{|}~
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)
}
}
Simply replace your RegEx rule [A-Z]+ with .*[A-Z]+.* (and other RegEx rules as well)
Rules
[A-Z]+ matches only strings with all characters capitalized
Examples: AVATAR, AVA, TAR, AAAAAA
Won't work: AVATAr
.* matches all strings (0+ characters)
Examples: 1, 2, AVATAR, AVA, TAR, a, b, c
.*[A-Z]+.* matches all strings with at least one capital letter
Examples: Avatar, avataR, aVatar
Explanation:
I. .* will try to match 0 or more of anything
II. [A-Z]+ will require at least one capital letter (because of the +)
III. .* will try to match 0 or more of anything
Avatar [empty | "A" | "vatar"]
aVatar ["a" | "V" | "atar"]
aVAtar ["a" | "VA" | "tar"]
Working Code
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
}
Examples:
checkTextSufficientComplexity("Avatar") // true || false || false
checkTextSufficientComplexity("avatar") // false || false || false
checkTextSufficientComplexity("avatar1") // false || true || false
checkTextSufficientComplexity("avatar!") // false || false || true
Here is a concise version of Joshuas answer in Swift 3, assuming that all validations must be fulfilled.
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
}