Ruby确定字符串是否只包含数字
我试图创建一个方法,要求用户创建一个pin码,比如银行账户pin码。它的长度只能是4个数字,输入的每个字符都必须是数字。我在使用此代码时发现:Ruby确定字符串是否只包含数字,ruby,regex,string,integer,Ruby,Regex,String,Integer,我试图创建一个方法,要求用户创建一个pin码,比如银行账户pin码。它的长度只能是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
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'转换为2134。同样,如果字符串中没有整数,它会将值记录为0,这不是我需要的假值
我发现了一篇非常有用的帖子,但在处理regexp的过程中似乎变得非常复杂。此帖子也被关闭,因为创建者不够具体:
所以我会尽量澄清,我试图限制用户输入,这样他们只能键入数字0到9。像10^3这样的数学公式必须是失败的,还有像-1234这样的负数,我正试图将它们限制为四位数,就像限制任何引脚一样。到目前为止,我完全被难住了,还没有找到一种不包含一大堆regexp的方法
也许我可以检查字符串是否包含不可接受字符的列表
谢谢
为了更好的措辞和纠正我在第二段中写的一个错误而编辑。以下将起作用:
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
这可以使用正则表达式在几行中完成。像下面这样的东西应该可以完成它
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”等。您应该尝试使用正则表达式:
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
你可以在这个网站上玩正则表达式:试试这个:
def valid_pin?(pin)
/^\d{4}$/ === pin
end
这基本上是说:
/^d{4}$/
是一个正则表达式,您可以分辨出来,因为它包含在/
/
中,中间有一个模式^
和$
字符分别表示字符串的开头和结尾。基本上可以确保不接受具有4个连续数字但在开头或结尾有其他字符的字符串(即“a1234”
和“5678b”
)\d
是表示数字的正则表达式字符。当后跟{4}
时,这意味着要查找正好4位数字。Ruby还允许您使用此符号{3,}
或范围{3,6}
指定最小值=
方法(正如@iamnotmaynard正确提到的)有时称为三等运算符,根据正则表达式是否匹配给定字符串返回布尔值(true
或false
)puts "Please give us a 4 digit pin number for your account:"
@response = gets.chomp
unless valid_pin?(@response)
puts "Your response must be 4 numbers in length."
create_pin
else
@pin = @response.to_i
puts "Your pin has been set."
end
如果你想尝试学习正则表达式(通常称为正则表达式),我鼓励你在这个很棒的网站上玩一玩,这里有一个通用的关键字列表和正则表达式沙盒,可以帮助你编写文本。这是一个微不足道的正则表达式。就我个人而言,我建议你多花点时间来弄清楚,或者让我们看看你做了什么。没有比这更简单的了,而且很容易搜索。老实说,我不知道如何使用regexp。我想知道是否有像numeric这样的特殊方法?(这不起作用)我可以运行,但我想我迟早要学习regexp。而且,我永远不知道我发布的代码是太多还是太少。我应该继续讨论主题,但我永远不知道主题是什么,因为我的许多错误都与语法有关。“它将值记录为nil,这并不是我所需要的错误。”只是澄清一下,在ruby中,nil和false实际上是
false
中唯一的错误。您的问题不是nil
,而是当调用to\u i
时,以非数字字符开头的字符串将返回0
。您的意思是将此字符串转换为整数
,然后询问这是整数
。答案很明显,这是因为你刚刚做了一个。正则表达式技能对于任何开发都是强制性的。所以我注意到了。wvandaal和hbejgel都把我和Rubular联系在一起。对于初学者来说,这似乎是一个很好的资源。还有,工程师们你说得对,我的意思是键入0而不是nil。当所有只使用字母的PIN实际传递并保存为0时,我发现了这个问题。我会修改它。这是正确的正则表达式。如果您使用,您可以简化命令,并避免稍显粗糙的
(因为它返回布尔值):/^\d{4}$/==“1234”=>true