使用Ruby验证用户输入(字符串)

时间:2015-05-04 03:16:13

标签: ruby regex validation date

我想确保来自用户的唯一输入是8个数字(输入将默认为整数)。

我的目标是确保用户输入日期格式为:yyyymmdd。

如果他不输入这种格式,我想再次使用循环输入,直到他输出正确的格式(yyyymmdd)。

我的当前循环不验证日期,它传递每个输入。

txt=gets

re1='((?:(?:[1]{1}\\d{1}\\d{1}\\d{1})|(?:[2]{1}\\d{3}))(?:[0]?[1-9]|[1][012])(?:(?:[0-2]?\\d{1})|(?:[3][01]{1})))(?![\\d])' # YYYYMMDD 1

re=(re1)
m=Regexp.new(re,Regexp::IGNORECASE);

while m.match(txt) 
  txt=gets
end

2 个答案:

答案 0 :(得分:1)

尝试以下几点:

require 'date'
d=nil
loop do
   puts 'Enter date YYYYMMDD'
   st = gets.chomp
   if st.match('^(\d\d\d\d)(\d\d)(\d\d)$')
      begin
          d=Date.strptime("#{$1}/#{$2}/#{$3}", '%Y/%m/%d')
          break
      rescue ArgumentError
          puts 'BAD DATE!'
      end  
   end 
end

puts d

但就个人而言,我会更改正则表达式,以便用户可以输入日期行:

2014/2/2
2015 12 25
1999-2-02

正则表达式是:

^\D*(\d\d\d\d)\D+(\d\d?)\D+(\d\d?)\D*$

Demo

然后在日期的元素之间需要分隔符。任何非数字都可以。

更新的代码:

require 'date'
d=nil
loop do
   puts 'Enter date YYYY-MM-DD'
   st = gets.chomp
   if st.match('^\D*(\d\d\d\d)\D+(\d\d?)\D+(\d\d?)\D*$')
      begin
          d=Date.strptime("#{$1}/#{$2}/#{$3}", '%Y/%m/%d')
          break
      rescue ArgumentError
          puts 'BAD DATE!'
      end  
   end 
end

puts d

答案 1 :(得分:0)

这是一个可用的Regexp:

regexp = /([0-9]+{4})((0[1-9]+)|(1[0-2]+))(([0-2]+[0-9]+)|(3[0-1]+))/
m = regexp.match '19990531'
m[1] #=> 1999, year
m[2] #=> 05, month
m[5] #=> 31, day

我可能接受@alfasin建议的解决方案,它有意义并允许不同的格式......

...但是,您应该知道不同的区域设置以不同的方式输入日期,并且使用Date.parse方法可能会产生意外的结果。例如,1.2是2月1日在欧盟,而1月2日在美国......