Попробуйте это.
def get_password
loop do
puts "Please enter your password"
my_password = gets.chomp
str =
case my_password
when /\A.{,6}\z/ then "seven characters"
when /\A[^A-Z]+\z/ then "one uppercase letter"
when /\A[^a-z]+\z/ then "one lowercase letter"
when /\A\D+\z/ then "one digit"
when /\A[^$%&!]+\z/ then "one symbol"
else break my_password
end
puts "Passwords must contain at least #{str}"
end
end
pw = get_password
#=> "abcDEF123$$$"
puts pw
"abcDEF123$$$"
Обратите внимание, что метод не вернется, пока не будет получен действительный пароль. То, что составляет допустимый символ, конечно, должно быть определено.
Если значение должно отображаться, обычно лучше вернуть значение из метода, а затем отобразить его. Таким образом, тот же метод может использоваться для получения пароля, который должен использоваться другими способами, а не просто отображать его.
В качестве альтернативы можно написать следующее.
R = /
\A
(?=.{7}) # match seven chars in a positive lookahead
(?=.*\p{Ll}) # match a lowercase letter in a positive lookahead
(?=.*\p{Lu}) # match an uppercase letter in a positive lookahead
(?=.*\d) # match a digit in a positive lookahead
(?=.*[$%&!]) # match a symbol in a positive lookahead
/x # free-spacing regex definition mode
def get_password
loop do
puts "Please enter your password"
my_password = gets.chomp
break my_password if my_password.match?(R)
puts "Passwords must contain at least seven characters, one uppercase"
puts "letter, one lowercase letter and one symbol"
end
end
pw = get_password
#=> "aA1$$$$$$$$$$$$$$$$$$$$"
Регулярное выражение обычно записывается следующим образом.
R = /\A\(?=.{7})(?=.*\p{Ll})(?=.*\p{Lu})(?=.*\d)(?=.*[$%&!])/