2016-07-01 76 views
-1

我有一個時間標記產生的信息的程序,該時間戳具有相匹配的格式如下:MM/DD/YYYY HH:MM:SS AM or PM正則表達式匹配MM/DD/YYYY HH:MM:SS AM或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

我明白了。你想匹配09/14/2014 9:16:32 PM或09/14/2014 9:16:32 AM – zee

+0

我想匹配一個格式化的時間戳,可以包含16到20個字符(包括空格)這些時間戳的例子是'10/22/2016 9:15:32 PM'或'9/9/2016 9:9:5 PM'他們沒有數字0在他們面前,當它低於12點 – JohnDoeYo

+1

你需要顯示你的生成正則表達式的嘗試,而不是要求我們爲你寫。正則表達式有很好的文檔記錄,包括Ruby的Regexp類,所以編寫模式應該很容易研究和計算出來。 http://meta.stackoverflow.com/q/261592/128421 –

回答

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 
+1

這是完美的,謝謝 – JohnDoeYo

+1

對這是完美的,謝謝! – JohnDoeYo

+1

可以發誓我已經做到了!我的錯! – JohnDoeYo

2

的人物,如/:,甚至字母可以加litterally。試試這個:

/[01][0-9]/[0-3][0-9]/[0-9]{4} [0-2]?[0-9]:[0-6]?[0-9]:[0-6]?[0-9] (AM|PM)/ 
1

嘗試這個 。我希望我能理解你的問題。這裏測試http://rubular.com/,它的工作原理。

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

enter image description here

3

我不認爲一個正則表達式是這個工作的工具。我會用DateTime.strptime,給它期望的格式,讓它處理所有的「50個小時在一天中的時間無效」,「09與9」,......問題。

喜歡的東西:

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

正如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應該這樣做。