Ruby确定字符串是否只包含数字

Mar*_* Jr 3 ruby regex string integer

我正在尝试创建一种方法,要求用户创建一个密码,例如银行帐户密码.它的长度只能是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
Run Code Online (Sandbox Code Playgroud)

它不会像我希望的那样工作,因为.to_i方法很乐意将'2134a'转换为2134.同样,如果字符串中没有Integer,它会将值记录为0,因为我需要它而不是false成为.

使用Ruby测试字符串是否基本上是引号中的整数?

我发现了一个非常有用的帖子,但它似乎在线程中变得非常复杂到regexp.此帖也被关闭,因为创建者不够具体:

检查Ruby中的字符串是否只包含正数

所以我会尽力清楚,我试图限制用户的输入,使他们只能通过9数学方程像10 ^ 3需要键入数字0是失败的,以及像-1234负数,而且我试图将它们限制为四位数,就像任何引脚受限一样.到目前为止,我完全难过,并没有看到一种不包含一大堆正则表达式的方法.

也许我可以检查字符串是否包含不可接受的字符列表.

谢谢你.

编辑更好的措辞和纠正我在第二段写的错误.

wva*_*aal 7

试试这个:

def valid_pin?(pin)
  /^\d{4}$/ === pin
end
Run Code Online (Sandbox Code Playgroud)

这基本上是说:

  1. /^d{4}$/是一个正则表达式,你可以说,因为它被包含在/ /中间的一个模式
  2. ^$字符代表你的字符串的开头和结尾,分别.基本上确保的是具有4个连续数字但在开头或结尾(即"a1234""5678b")具有其他字符的字符串将不被接受.
  3. \d是表示数字的正则表达式字符.如果跟着{4},这意味着要查找正好4位数.Ruby还允许您使用此表示法{3,}或范围指定最小值{3,6}.
  4. ===方法(正如@iamnotmaynard正确提到的),有时称为threequals运算符,根据正则表达式是否与给定字符串匹配,返回一个布尔(truefalse)值.

在您的代码的上下文中:

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
Run Code Online (Sandbox Code Playgroud)

如果您想尝试学习正则表达式(通常称为RegExes),我建议您在令人敬畏的网站Rubular上玩游戏,有一个通用的关键字列表和RegEx沙箱来帮助您发送您的作品.

  • 这是正确的正则表达式.如果您使用[Regexp#===](http://www.ruby-doc.org/core-1.9.3/Regexp.html#method-i-3D-3D-3D),您可以简化命令并避免稍微hackish`!!`(因为它返回布尔值):`/ ^\d {4} $/==="1234"=> true` (3认同)