#arrays #ruby #object
#массивы #ruby #объект
Вопрос:
Попытка создать процедуру sing up в Ruby. У меня в коде встречается длина в семь символов, но пароль также должен содержать следующее:
- Символ верхнего регистра
- Символ в нижнем регистре
- Число
- Символ
Возникли проблемы с вводом этих требований в код. Приветствуется любая помощь.
puts "Please enter your password"
my_password = gets
if my_password.length < 7
puts "Your password is not long enough"
elsif my_password.length >= 7
print my_password
end
Комментарии:
1. Что вы пробовали? регулярные выражения могут проверять наличие подобных требований.
Ответ №1:
-
вы должны
chomp
вводить данные изgets
, иначе они будут содержать конечный возврат каретки. -
чтобы соответствовать всем критериям, вы должны явно проверить их все.
Вот так:
puts "Please enter your password"
my_password = gets.chomp
case
when my_password.length < 7
puts "Your password is not long enough"
when my_password !~ /[A-Z]/
puts "Your password must contain an uppercase letter"
when my_password !~ /[a-z]/
puts "Your password must contain a lowercase letter"
when my_password !~ /d/
puts "Your password must contain a digit"
when my_password !~ /[!?=_-]/
puts "Your password must contain one of those: [!?=_-]"
else
print my_password
end
Ответ №2:
Попробуйте это.
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 /AD z/ then "one digit"
when /A[^$%amp;!] 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
(?=.*[$%amp;!]) # 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)(?=.*[$%amp;!])/
Комментарии:
1. Я не имел никакого отношения к этим разноцветным звездам. Они упали на мой экран, когда я писал свой ответ. Вы можете поблагодарить stackoverflow за это.