我想确保来自用户的唯一输入是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
答案 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*$
然后在日期的元素之间需要分隔符。任何非数字都可以。
更新的代码:
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日在美国......