【问题标题】:Validating user input (string) using Ruby使用 Ruby 验证用户输入(字符串)
【发布时间】:2015-07-13 08:43:31
【问题描述】:

我想确保用户的唯一输入是 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

【问题讨论】:

  • 不需要正则表达式验证(复杂而缓慢),只需尝试解析日期,如果抛出异常,捕获它,显示错误消息并要求用户重新输入日期(在循环中执行,仅在输入有效日期时才中断)

标签: ruby regex validation date


【解决方案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

【讨论】:

  • 感谢 dawg,您的代码尊重闰年并通过测试。
【解决方案2】:

这是一个可用的正则表达式:

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 日......

【讨论】:

    猜你喜欢
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2017-06-08
    • 2015-09-21
    • 1970-01-01
    相关资源
    最近更新 更多