正则表达式匹配mm / dd / yyyy hh:mm:ss AM或PM

时间:2016-07-01 18:04:56

标签: ruby regex date time format

我有一个为时间戳创建信息的程序,时间戳必须符合以下格式: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'

5 个答案:

答案 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

RegEx Demo

这将验证以下任一输入行:

10/22/2016 9:15:32 PM
9/9/2016 9:9:5 AM

答案 3 :(得分:1)

试试这个。我希望我理解你的问题。在这里测试http://rubular.com/并且它有效。

  ^(\d{1,2}\/){2}\d{4}\s+((\d+)(\:)){2}\d+\s+(AM|PM)

enter image description here

答案 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>

所以你有它,有三种不同的方法来验证你的时间戳,取决于你想要使用它们的可能是另一个故事,但这三个中的任何一个应该可以做到。