Проверьте, содержит ли строка хотя бы букву upperCase, цифру или специальный символ в Swift?
Я пытаюсь создать метод, который обнаруживает, содержит ли строка число, букву верхнего регистра и специальный символ, используя регулярное выражение, как показано ниже
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 только для AVATAR и возвращает false для Avatar. Я хочу, чтобы мое регулярное выражение возвращало true, если оно содержит хотя бы одну UpperCase в String.
Ответы
Ответ 1
Просто замените правило RegEx [A-Z] + с помощью. * [A-Z]+. * (и других правил RegEx)
Правила
[A-Z] + соответствует только строкам со всеми заглавными буквами
Примеры: AVATAR, AVA, TAR, AAAAAA
Не работает: AVATAr
. * соответствует всем строкам (0+ символов)
Примеры: 1, 2, AVATAR, AVA, TAR, a, b, c
. * [A-Z]+. * соответствует всем строкам с хотя бы одной заглавной буквой
Примеры: Avatar, avataR, aVatar
Объяснение:
я.. * будет пытаться сопоставить 0 или более ничего.
II. [A-Z] + потребуется хотя бы одна заглавная буква (из-за +)
III.. * будет пытаться сопоставить 0 или более ничего
Аватар [пусто | "A" | "Vatar" ]
aVatar [ "a" | "V" | "Атар" ]
aVAtar [ "a" | "ВА" | "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
Ответ 2
Вот краткая версия ответа Джошуа в Swift 3, предполагая, что все проверки должны выполняться.
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
}
Ответ 3
Другое альтернативное решение.
Вы можете выполнить все проверки, используя одно регулярное выражение.
RegExp: ^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[[email protected]$!%*?&])[A-Za-z\\[email protected]$!%*?&]{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)(?=.*[[email protected]$!%*?&])[A-Za-z\\[email protected]$!%*?&]{8,}"
let isMatched = NSPredicate(format:"SELF MATCHES %@", regex).evaluate(with: yourTextField.text)
if(isMatched == true) {
// Do your stuff ..
} else {
// Show Error Message.
}