2015-04-09 2 views
10

Я пытаюсь создать метод, который находит, содержит ли строка номер, букву верхнего регистра и специальные символы, используя регулярные выражения, как показано нижеПроверьте, содержит ли строка, по крайней мере, букву 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 

    } 

Проблема заключается ниже регулярное выражение [AZ] + возвращает истину только для AVATAR и возвращает false для Avatar. Я хочу, чтобы мое регулярное выражение возвращало true, если оно содержит хотя бы одну UpperCase в String.

+0

Я думаю, что 'evaluateWithObject' пытается сопоставить всю строку. Попробуйте использовать что-то вроде этого: '^. *? [A-Z]. *? $'. – npinti

+0

Я didnot получить это .. Можете ли вы подробнее рассказать об этом регулярном выражении ?? –

+0

Возможно, что вызов функции '' оценщик '' пытается сопоставить всю строку, поэтому задана строка вроде этого: 'Hello123' и регулярное выражение, подобное этому:' [AZ] + ', Swift сопоставляет его с что-то вроде этого: '^ [AZ] + $'. Это означает, что он будет ожидать, что строка * complete * будет точно соответствовать *. Пожалуйста, попробуйте внести изменения, если это сработает, я отправлю ответ с дополнительной информацией. Я не разработчик Swift, поэтому я могу ошибаться, поэтому я разместил это как комментарий. – npinti

ответ

21

Просто замените правило RegEx [AZ] + с. * [AZ] +. * (И другие правила RegEx а)

Правила

[AZ] + матчи только строки всех символы прописных букв

Примеры: АВАТАР, AVA, TAR, аааааа
не буду работа:. аватаре

* соответствует всем строкам (0+ символов)

Примеры: 1, 2, ВОПЛОЩЕНИЕ, АВА, ТАР, а, б, в

. * [AZ] +. * соответствует всем строкам, по крайней мере, одной буквы

E xamples: Аватар, АВАТАР, AVATAR

Объяснение:.

I. * будет пытаться соответствовать 0 или больше ничего
II. [A-Z] + потребуется хотя бы одна заглавная буква (из-за +)
III. . * будет пытаться соответствовать 0 или больше из ничего

Avatar [empty | «A» | "vatar"]
aVatar ["a" | "V" | "atar"]
aVAtar ["a" | "ВА" | "Деготь"]

Рабочего код

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 
+1

Примечание: просто замените || на &&, если вам нужны все правила для применения –

+0

, вы знаете, что это не работает .... все три результата становятся истинными ... хотя я вставляю только цифры ... потому что. * соответствует всем ул ings .. –

+0

есть некоторые опечатки в исходном коде, такие как ** texttest.evaluateWithObject («AniP») ** и должны быть заменены на ** texttest.evaluateWithObject (текст) ** для его оценки параметра. ** texttest2 ** также использует номер RegEx (он должен использовать специальный символ RegEx) :) –

6

Вот является краткой версией Joshuas ответа в 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 
} 
1

Другое альтернативное решение.

Вы можете сделать все проверки, используя одно регулярное выражение.

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. 
} 
Смежные вопросы