Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何确保用户输入在ruby中至少包含一个大写、小写、符号和数字_Arrays_Ruby_String_Loops - Fatal编程技术网

Arrays 如何确保用户输入在ruby中至少包含一个大写、小写、符号和数字

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

我希望确保用户输入的密码长度至少为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 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”
也不要忘了防止空格中出现类似
密码的字符。计数(“”
),如果返回值大于零,则会失败。