2013-02-21 44 views
2

我正在嘗試創建特定日期的正則表達式。它正確處理7am11:34pm。它應該能夠識別不合時宜的時代。現在我已經嘗試爲這個問題寫一個工作正則表達式。一天中的時間的正則表達式

正則表達式^(([0]?[0-9])|([1][0-2]))(\:[00-59]{2})?(am|pm){1}\b

的問題是,在antemeridiem,小時部分從1(或01)至12變化的,但在它postmeridiem從0(或00)變化到12。我無法推斷出這種情況的正則表達式。請幫助。

+2

'[0-12]'只匹配'0','1'或'2'。正則表達式匹配文本,而不是數字。與[00-59]相同,匹配0,1,2,3,4,5或9。 – 2013-02-21 12:41:22

+0

@TimPietzcker我改變了表情。 – 2013-02-21 12:50:07

+2

我猜測@TimPietzcker解釋說,字符類'[]'中的範圍只匹配文本(或字符),另一個使得這個非常簡單的規則就是:範圍只能**只包含兩個字符,其他角色將分開匹配。例如'[0-9]'匹配字符* 0 *到* 9 *,但由於前面解釋過的規則'[0-90]'從未匹配從* 0 *到* 90 *。 – kjetilh 2013-02-21 13:06:38

回答

2

我不打算開始爭論什麼12小時的系統應該是一樣的,但只是用你的要求給出/固定:

問題是,在antemeridiem中,小時部分從1(或01)到12變化,但在postmeridiem中,它從0(或00)到12變化。我無法推導出這種情況下的正則表達式。請幫助。

然後,這個正則表達式應該工作:

^(((0?[1-9]|1[012])(:[0-5][0-9])?am)|((0?[0-9]|1[012])(:[0-5][0-9])?pm))\b 

見自己here

+0

不錯的+1我:) – HamZa 2013-02-21 14:13:44

+0

因爲我和其中一個人進行了非常激烈的談話。我對此表示歉意。現在我意識到我問的問題其實是錯誤的。這仍然是我的「錯誤」問題的答案。 – 2013-02-21 14:50:02

1

你總是可以這樣做:

(我的正則表達式時)| (我的正則表達式)

只要你有你的括號在正確的地方,它應該工作得很好。

0

嘗試這樣:

^(0?[1-9]|1[0-2])(:([0-5]?[0-9]))?(am|pm)$

0

這應該符合您的要求。

^(([0]?[0-9])|([1][0-2])){1}(\:)?([0-5][0-9])?(am|pm){1}

而且,你要使用正則表達式匹配數字

[00-59]

,我不認爲它的工作原理是這樣,你匹配的字符串,最好是用[0-5] [0-9]代替。

0

我想爲此找到一個好的正則表達式。我使用了一種叫做快報工具,並通過以下公式進行12小時的時間匹配上前:

((1{0,1}[012]{1})|[0-9]{1}){1}((:|\s)?[0-5]{1}[0-9]{1})?((a|p|A|P){1}(m|M){1})? 

我對以下數據進行測試:

12:00 
12am 
11111111PM 
pm 
11122am 
13 
00am 
9a 

和表達想出了下面的比賽:

12:00 
12am 
1111 
1111PM 
1112 
2am 
1 
3 
0 
0am 
9 

如果您正在驗證數據並比較匹配數據長度,則可以丟棄從11111111PM和中找到的部分匹配。這對我有用。