我有一个为时间戳创建信息的程序,时间戳必须符合以下格式:MM/DD/YYYY HH:MM:SS AM or PM
例如:
06/02/2016 10:14:56 AM
09/14/2014 9:16:32 PM
我需要一种方法来匹配这些信息,使用优先的正则表达式,但它不一定是正则表达式。对此的任何帮助将不胜感激。
我知道如何匹配数字/\d+/
和非空格字符,但是匹配数字不会抓住:
,/
,AM or PM
。除了明显的白色空间外,抓住非白色空间将抓住所有东西。
所以回顾一下,我需要一种方法来验证格式化的时间和日期:MM/DD/YYYY HH:MM:SS AM or PM
可以包含20到22个字符(包括空格),或者不作为用户输入给出。
我需要的例子:
def timestamp
print 'Enter the time stamp to verify: '
ts = gets.chomp
if !(ts[REGEX-HERE])
puts 'Invalid formatting of time stamp'
exit 1
else
puts ts
end
end
# <= 6/1/2016 1:10:5 PM will output '6/1/2016 1:10:5 PM'
# <= 06/01/2016 01:10:05 PM will output 'Invalid formatting of time stamp'
# <= 10/1/2016 1:25:43 AM will output '10/1/2016 1:25:43 AM'
# <= 10/01/2016 01:25:43 AM will output 'Invalid formatting of time stamp'
答案 0 :(得分:3)
我不认为正则表达式是这项工作的正确工具。我使用DateTime.strptime
,给它预期的格式,并让它处理所有&#34; 50小时在一天中的某个时间无效&#34;,&#34; 09对9&#34;,......问题。
类似的东西:
require 'date'
def timestamp
print 'Enter the time stamp to verify: '
ts = gets.chomp # You might want to include a String#strip call in here too
DateTime.strptime(ts, '%m/%d/%Y %I:%M:%S %p')
puts ts
rescue ArgumentError
puts 'Invalid formatting of time stamp'
exit 1
end
正则表达式很好但它们不应该是你唯一的解析工具。
答案 1 :(得分:2)
/
和:
等字符,甚至可以添加字母。试试这个:
/[01][0-9]/[0-3][0-9]/[0-9]{4} [0-2]?[0-9]:[0-6]?[0-9]:[0-6]?[0-9] (AM|PM)/
答案 2 :(得分:2)
此正则表达式适用于验证输入:
^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{1,2}:\d{1,2} [AP]M\z
这将验证以下任一输入行:
10/22/2016 9:15:32 PM
9/9/2016 9:9:5 AM
答案 3 :(得分:1)
答案 4 :(得分:1)
正如mu is too short
所说的那样,正则表达式非常棒而且除了你需要更多的东西之外,还有你需要更多的东西。
def timestamp
print 'Enter time stamp: '
ts = gets.chomp.upcase
verify = DateTime.strptime(ts, '%m/%d/%Y %I:%M:%S %p')
puts ts
rescue ArgumentError
puts 'Invalid timestamp formatting must contain date time AM or PM'
timestamp
end
当然这可能会导致缓冲区溢出,因为它是递归的,但发生这种情况的可能性很小。
运行时:
irb(main):01:0> def timestamp
irb(main):02:1> print 'Enter time stamp: '
irb(main):02:1> ts = gets.chomp.upcase
irb(main):04:1> verify = DateTime.strptime(ts, '%m/%d/%Y %I:%M:%S %p')
irb(main):05:1> puts ts
irb(main):06:1> rescue ArgumentError
<valid timestamp formatting must contain date time AM or PM'
irb(main):07:1> timestamp
irb(main):08:1> end
=> :timestamp
irb(main):09:0> timestamp
Enter time stamp: test
Invalid timestamp formatting must contain date time AM or PM
Enter time stamp: 06/30/2016 6:6:54 pm
06/30/2016 6:6:54 PM
=> nil
但是,您可以更好地检查:
def enter_stamp
print 'Enter timestamp: '
ts = gets.chomp
verify_stamp(ts)
end
def verify_stamp(timestamp)
Date.strptime(timestamp, '%m/%d/%Y %I:%M:%S %p')
puts timestamp unless ArgumentError
rescue ArgumentError
puts 'Invalid timestamp format'
enter_stamp
end
这使得方法更加OOPish,Ruby就是OOP所以它有点工作。运行时:
irb(main):001:0> require 'date'
=> true
irb(main):002:0>
irb(main):003:0* def enter_stamp
irb(main):004:1> print 'Enter timestamp: '
irb(main):005:1> ts = gets.chomp
irb(main):006:1> verify_stamp(ts)
irb(main):007:1> end
=> :enter_stamp
irb(main):008:0>
irb(main):009:0* def verify_stamp(timestamp)
irb(main):010:1> Date.strptime(timestamp, '%m/%d/%Y %I:%M:%S %p')
irb(main):011:1> puts timestamp unless ArgumentError
irb(main):012:1> rescue ArgumentError
irb(main):013:1> puts 'Invalid timestamp format'
irb(main):014:1> enter_stamp
irb(main):015:1> end
=> :verify_stamp
irb(main):016:0> enter_stamp
Enter timestamp: test
Invalid timestamp format
Enter timestamp: 06/12/2016 8:08:54 pm
=> nil
当然你也可以只使用正则表达式:
def verify_timestamp(stamp)
if !(stamp[/^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{1,2}:\d{1,2} [AP]M\z/])
puts 'Invalid timestamp formatting'
timestamp
else
stamp
end
end
def timestamp
print 'Enter timestamp for removal: '
ts = gets.chomp
verify_timestamp(ts)
end
正如我所说的正则表达式很精彩,它们并不是一直都是最好用的东西。当它运行时:
irb(main):001:0> def verify_timestamp(stamp)
<mp[/^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{1,2}:\d{1,2} [AP]M\z/])
irb(main):003:2> puts 'Invalid timestamp formatting'
irb(main):004:2> timestamp
irb(main):005:2> else
irb(main):006:2* stamp
irb(main):007:2> end
irb(main):008:1> end
=> :verify_timestamp
irb(main):009:0>
irb(main):010:0* def timestamp
irb(main):011:1> print 'Enter timestamp for removal: '
irb(main):012:1> ts = gets.chomp
irb(main):013:1> verify_timestamp(ts)
irb(main):014:1> end
=> :timestamp
irb(main):015:0> verify_timestamp(timestamp)
Enter timestamp for removal: test
Invalid timestamp formatting
Enter timestamp for removal: 06/12/2016 8:18:54 pm
=> "06/12/2016 8:18:54 pm"
irb(main):016:0>
所以你有它,有三种不同的方法来验证你的时间戳,取决于你想要使用它们的可能是另一个故事,但这三个中的任何一个应该可以做到。