我正在尝试创建一种方法,要求用户创建一个密码,例如银行帐户密码。它的长度只能是4个数字,输入的每个字符必须是数字。我在使用此代码时发现:
puts "Please give us a 4 digit pin number for your account:"
@response = gets.chomp
unless @response.to_i.is_a?(Integer) && @response.to_str.length == 4
puts "Your response must be 4 numbers in length."
create_pin
else
@pin = @response.to_i
puts "Your pin has been set."
end
它不能正常工作,因为.to_i方法很乐意转换' 2134a'同样,如果字符串中没有整数,它会将值记录为0,这不是我所需要的假。
Test if a string is basically an integer in quotes using Ruby?
我发现了一个非常有用的帖子,但它似乎在线程中变得非常复杂到regexp。这篇文章也被关闭了,因为创作者不够具体:
Check if string contains only positive numbers in Ruby
所以我试着说清楚,我试图限制用户输入,这样他们只能键入0到9的数字。数学方程式如10 ^ 3需要失败,以及负数如-1234 ,我试图将它们限制为四位数,就像任何引脚受限一样。到目前为止,我完全难以接受,并且没有找到一种方法来做到这一点并不包含一大堆正则表达式。
也许我可以检查字符串是否包含不可接受的字符列表。
非常感谢。
编辑更好的措辞并纠正我在第二段写的错误。
答案 0 :(得分:7)
试试这个:
def valid_pin?(pin)
/^\d{4}$/ === pin
end
这主要是说:
/^d{4}$/
是一个正则表达式,您可以告诉它,因为它包含在/
/
中,中间有一个模式^
和$
字符分别表示字符串的开头和结尾。基本上可以确保的是,不会接受包含4个连续数字但在开头或结尾有其他字符的字符串(即"a1234"
和"5678b"
)。\d
是表示数字的正则表达式字符。当后跟{4}
时,这意味着要查找正好4位数。 Ruby还允许您使用此表示法{3,}
或范围{3,6}
指定最小值。===
方法(正如 @iamnotmaynard 正确提到的),有时称为 threequals 运算符,返回布尔值(true
或{ {1}})值取决于正则表达式是否与给定字符串匹配。在您的代码中:
false
如果您想尝试了解正则表达式(通常称为RegExes),我建议您在精彩的网站Rubular上玩游戏,有一个通用的关键字列表和RegEx沙箱来帮助您发表您的作品。
答案 1 :(得分:0)
以下内容可行:
puts "Please give us a 4 digit pin number for your account:"
@response = gets.chomp
unless @response.match(/\d{4}/) && @response.length == 4
puts "Your response must be 4 numbers in length."
create_pin
else
@pin = @response.to_i
puts "Your pin has been set."
end
答案 2 :(得分:0)
这可以使用正则表达式在几行中完成。像下面这样的东西应该完成它。
if @response =~ /^\d{4}$/
@pin = @response
else
puts "Your pin must be 4 numbers in length."
create_pin
end
在正则表达式中,' ^'和' $'分别表示字符串的开头和结尾。添加这些保证您不会在您正在寻找的4位数之前或之后发生垃圾。因此,您可以避免使用' 1234a'
等答案' \ d {4}'将匹配4个连续数字0-9。
因此,您已将用户范围缩小到只有“3421'' 9843'等”的回复。
答案 3 :(得分:0)
您应该尝试使用正则表达式:
unless /[0-9]{4}/.match(@response).to_s.length == 4 && @response.length == 4
puts "Your response must be 4 numbers in length."
create_pin
else
@pin = /[0-9]{4}/.match(@response).to_s.to_i
puts "Your pin has been set."
end
您可以在本网站中使用正则表达式进行玩具:http://rubular.com/