Arrays 如何确保用户输入在ruby中至少包含一个大写、小写、符号和数字
我希望确保用户输入的密码长度至少为7个字符,并且至少有一个大写字母、一个小写字母、一个数字和一个符号。 代码似乎要通过if循环,直到符号参数卡住为止Arrays 如何确保用户输入在ruby中至少包含一个大写、小写、符号和数字,arrays,ruby,string,loops,Arrays,Ruby,String,Loops,我希望确保用户输入的密码长度至少为7个字符,并且至少有一个大写字母、一个小写字母、一个数字和一个符号。 代码似乎要通过if循环,直到符号参数卡住为止 puts "Please enter your desired password: " password = [] pass_clear = () while pass_clear == (nil) do password = gets.to_s.chomp if password.length < 7 puts "Your
puts "Please enter your desired password: "
password = []
pass_clear = ()
while pass_clear == (nil) do
password = gets.to_s.chomp
if password.length < 7
puts "Your password must contain at least seven characters."
elsif password.count("a-z") == password.length
puts "Your password must contain at least one uppercase character."
elsif password.count("A-Z") == password.length
puts "Your password must contain at least one lowercase character."
elsif password.count("!","@","#","$","%","^","&","*","(",")","_","-","+","=") < 1
puts "Your password must contain at least one symbol."
elsif password.count("0","1","2","3","4","5","6","7","8","9") < 1
puts "Your password must contain at least one number."
else
puts "Thank you, your account is complete."
pass_clear == 1
end
end
不管有多少个符号,它都会继续在符号阶段循环。
如何确保识别这些符号,以便循环能够完成?您引用的每个符号都不正确。您还必须转义-和^字符
password.count("!@#$%\\^&*()_\\-+=")
在这个例子中对我很有用
您还需要使用一个数字范围,如:
password.count("0-9")
-字符用于像“a-z”这样的范围,因此必须对其进行转义,而克拉^
密码。计数(“^a-z”)
将返回不在a-z范围内的所有内容的计数
这很方便,因为您可能希望防止某些字符出现在密码字符串中。你可以这样做:
password.count("^a-zA-Z!@#$%\\^&*()_\\-+=0-9)
这将计算您定义之外的任何其他字符,因此您希望获得零返回值,以知道它们没有使用任何禁止的字符
关于
count()
中范围的进一步说明。术语“范围”不应与Ruby类“范围”混淆。范围类别使用“.”或“…”作为中间项目。在count()
方法中,考虑的范围是从第一个字符的ASCII号到第二个字符的ASCII号的ASCII范围。这就是为什么在我最初输入的A-z
中,将ASCII 65(“A”)计算为ASCII 122(“z”),其中碰巧包括ASCII 92到96字符,这些字符不是字母,而是\]^ `您引用的每个符号都不正确。您还必须转义-和^字符
password.count("!@#$%\\^&*()_\\-+=")
在这个例子中对我很有用
您还需要使用一个数字范围,如:
password.count("0-9")
-字符用于像“a-z”这样的范围,因此必须对其进行转义,而克拉^
密码。计数(“^a-z”)
将返回不在a-z范围内的所有内容的计数
这很方便,因为您可能希望防止某些字符出现在密码字符串中。你可以这样做:
password.count("^a-zA-Z!@#$%\\^&*()_\\-+=0-9)
这将计算您定义之外的任何其他字符,因此您希望获得零返回值,以知道它们没有使用任何禁止的字符
关于
count()
中范围的进一步说明。术语“范围”不应与Ruby类“范围”混淆。范围类别使用“.”或“…”作为中间项目。在count()
方法中,考虑的范围是从第一个字符的ASCII号到第二个字符的ASCII号的ASCII范围。这就是为什么在我最初输入的A-z
中,将ASCII 65(“A”)计算为ASCII 122(“z”),其中碰巧包括ASCII 92到96字符,这些字符不是字母,而是\]^ `一个选项是使用一个正则表达式,该正则表达式包含四个正面的lookahead,所有这些字符都从字符串的开头开始操作
R = /
(?=.*\p{Ll}) # match lowercase letter
(?=.*\p{Lu}) # match uppercase letter
(?=.*\d) # match digit
(?=.*[#{Regexp.escape("!@#$%^&*(,)_+=-")}]) # match special char
/x # free-spacing regex def mode
def password_ok?(str)
str.match?(R)
end
password_ok? "aA1#" #=> true
password_ok? "A1#" #=> false
password_ok? "a1#" #=> false
password_ok? "aA#" #=> false
password_ok? "aA1" #=> false
一个选项是使用包含四个正lookahead的正则表达式,所有这些都从字符串的开头开始操作
R = /
(?=.*\p{Ll}) # match lowercase letter
(?=.*\p{Lu}) # match uppercase letter
(?=.*\d) # match digit
(?=.*[#{Regexp.escape("!@#$%^&*(,)_+=-")}]) # match special char
/x # free-spacing regex def mode
def password_ok?(str)
str.match?(R)
end
password_ok? "aA1#" #=> true
password_ok? "A1#" #=> false
password_ok? "a1#" #=> false
password_ok? "aA#" #=> false
password_ok? "aA1" #=> false
这就解决了,谢谢。为什么需要逃跑?我有点新,所以这是我第一次使用它。我的最后一行代码中有一个输入错误,范围
“a-z”
应该是“a-z”
。这个输入错误产生了一些奇怪的效果,因为在“A-z”
之间有一些字符,如[
和]
,也不要忘记使用类似密码的空格。计数(“”)
,如果返回值大于零,则会失败。这就解决了问题,谢谢。为什么需要逃跑?我有点新,所以这是我第一次使用它。我的最后一行代码中有一个输入错误,范围“a-z”
应该是“a-z”
。这个输入错误产生了一些奇怪的效果,因为在之间有一些字符,如[
和]
“A-z”
也不要忘了防止空格中出现类似密码的字符。计数(“”
),如果返回值大于零,则会失败。