2014-05-21 43 views
0

我想一個正則表達式,其將驗證日期是在以下格式之一:正則表達式用於驗證日/月/年以可選的時間

  • DD/MM/YYYY
  • DD/MM/YYYY HH:MM
  • DD/MM/YYYY HH:mm:ss的

到目前爲止,我已經得到了

^([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/[1-2]\d{3}((\s([0-1]\d|[2][0-3])\:[0-5]\d\((:[0-5]\d)?)?)$ 

我一直在an online regex tester嘗試。輸入匹配時,我嘗試21/05/2014但不是21/05/2014 15:5421/05/2014 15:54:12

這可能是一個錯位?錯誤,但與我有限的正則表達式技能,它看起來對我來說是正確的。

請注意,我不想過分挑剔諸如閏年和日期這樣的事情。 [01-31]/[01-12]/[1000-2999]適用於日期部分。

+0

你確定regex是正確的工具嗎?正則表達式非常適用於驗證*格式*,但是如果您想檢查日期是否有效,無論如何您都應該使用日期庫(無論使用哪種語言),並且它也可能會進行解析。 – Biffen

+0

@Biffen正則表達式是正確的工具,因爲它不用於代碼。使用[CSV Lint](http://csvlint.io/about)驗證csv文件是一種進入.json模式的模式。 –

回答

2

在你表達的時候,你想匹配一個開括號:

((\s([0-1]\d|[2][0-3])\:[0-5]\d\((:[0-5]\d)?)?) 
           ^^ 

如果刪除,你應該不錯。不過,我清理了一些這些匹配組一個bit..so 1天,2個月,3年是,4爲小時,5分鐘是,6是第二:

^([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/([1-2]\d{3})(?:(?:\s([0-1]\d|[2][0-3])\:([0-5]\d)(?::([0-5]\d))?)?)$ 

Demo

但是,有了這樣複雜的表達式,可能需要使用x修飾符並在(?# ...)中添加空格&註釋。


最後,我建議一些much simpler這樣的:

^\d{2}\/\d{2}\/\d{4}\s*(?:\d{2}:\d{2}(?::\d{2})?)?$ 

這種情況很容易讀取/修改/調試,並仍將匹配相同的一組數字。比你可以使用你的語言(PHP,Java,Javascript,Python等)庫嘗試創建一個DateTime類。如果失敗,那麼你知道它的日期無效。這將會更準確,因爲你的表情仍然會匹配30/02/2014這不是一天。

+0

謝謝,工作。如果允許,我會在9分鐘內接受答案。 –

+0

沒問題,我更新了一些最後的想法:) – Sam

+1

'\ s *(?:'→'(?:\ s *')不允許尾隨空格,如果它只是一個日期。 – Biffen