正如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是關於面向對象,所以它的作品。當這樣運行:
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
正如我所說regexs是美妙的,他們只是不完全使用所有最好的東西時間。當這個運行:
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>
所以你有它,有三種不同的方法來驗證您的時間戳,這取決於你想使用它們可能是另一個故事的東西,但任何這些三個sh應該這樣做。
我明白了。你想匹配09/14/2014 9:16:32 PM或09/14/2014 9:16:32 AM – zee
我想匹配一個格式化的時間戳,可以包含16到20個字符(包括空格)這些時間戳的例子是'10/22/2016 9:15:32 PM'或'9/9/2016 9:9:5 PM'他們沒有數字0在他們面前,當它低於12點 – JohnDoeYo
你需要顯示你的生成正則表達式的嘗試,而不是要求我們爲你寫。正則表達式有很好的文檔記錄,包括Ruby的Regexp類,所以編寫模式應該很容易研究和計算出來。 http://meta.stackoverflow.com/q/261592/128421 –