2013-01-16 40 views
1

我有一個很難的字符串讀取具有日期和時間格式爲:日期時間正則表達式不起作用

YYYYMMDDHHmmSS.FFFF[+|-]ZZzz 
  • YYYY是一年,
  • MM是月(在開始01到12),
  • DD是天(01-31),
  • HH是小時(00-23),
  • mm是分鐘(00-59),
  • SS是第二(00-59),
  • FFFF是第二(0000-9999)的分數,
  • ZZzz是「差小時(ZZ - 值從+14到-12)和 分鐘(zz-值爲00到59)來自協調世界時間 (UTC)。「

這是在HL7中傳輸日期時間信息的標準,但不用擔心。我遇到的問題是處理我爲此標準編寫的正則表達式的系統拒絕讓我在第二個字段之後添加點。它也不允許ZZ字段之前的加號或減號。

這裏是正則表達式我已經寫:

/^(1|2)\\d{3}(0[1-9]|1[0-2])(0[1-9]|(1|2)[0-9]|3(0|1))((0|1)[0-9]|2[0-3])[0-5][0-9][0-5][0-9]\\.\\d{4}((\\+|\\-)0[0-9]|\\-1[0-2]|\\+1[0-4])[0-5][0-9]$/ 

及其Limesurvey,其驗證領域對於一個給定的問題。如果你不知道那是什麼,只要知道它的正則表達式使用Perl約定即可。

請注意,如果我刪除了\。或\ + \ - ,它工作得很好(除正則表達式不再執行標準外)。我也嘗試不逃避反斜槓,但這也沒有做任何事。

如果有人可以指出爲什麼這不起作用,我將不勝感激。請注意,如果在正則表達式中看起來有些奇怪或冗餘,那麼從邏輯上將它分解到各個字段以便於閱讀,這很可能是這種情況。

回答

1

我幾乎沒有改變你的正則表達式直到+14到-12部分。我不太你可以看到它在這裏工作:http://www.regex101.com/r/jF1bA9

最後的正則表達式:

^(1|2)[0-9]{3}(0[1-9]|1[0-2])((0[1-9])|((1|2)[0-9])|3(0|1))((0|1)[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])\.[0-9]{4}(\+0[0-9]|\+1[0-4]|-0[0-9]|-1[0-2])[0-5][0-9]$ 

正則表達式解釋說:

啓動線: ^ //開始

年代:

(1|2)[0-9]{3}

月:

(0[1-9]|1[0-2])

日:

((0[1-9])|((1|2)[0-9])|3(0|1))

小時:

((0|1)[0-9]|2[0-3])

分鐘:

([0-5][0-9])

秒:

([0-5][0-9])

期間:

\.

第二的分數:

[0-9]{4}

匹配+14通過-12(什麼,你可能需要改變)

(\+0[0-9]|\+1[0-4]|-0[0-9]|-1[0-2])

匹配: +14 +13 +12 +11 +10 +09 +08 +07 +06 +05 +04 +03 +02 +01 +00 -00 -01 -02 -03 -04 -05 -06 -07 -08 -09 -10 -11 -12

00 - 59:

[0-5][0-9]

行的末尾:

$


您可能需要改變它與您的特定語言的工作(我看到你有雙反斜槓在一些地方如\\d

+0

謝謝,工作! – user1193807