2012-05-25 58 views
0

我目前正在一個grails項目中工作,並且最終導致了一個關於grails中匹配約束的問題。我的字段應該只接受完全一樣的日期狀格式的字符串:正則表達式驗證grails類似於日期的格式

2012年10月25日下午5:00

這可能在使用正則表達式匹配的約束?我總是很難用正則表達式進行數據過濾,因爲它有點混亂。

+1

我不認爲這是一個好主意,使用正則表達式來匹配日期時間。取而代之的是查看語言/框架是否提供了一個日期時間函數,該函數接受字符串,格式字符串並將其轉換爲日期/時間對象,如果不能,則返回false。 – Vikas

回答

1

有沒有日期對象,你可以使用?我不知道,但我可以幫助你的正則表達式:

構建正則表達式是不困難的,尤其是在你的情況直截了當:

^\d{2}-\d{2}-\d{4} \d{2}:\d{2}[AP]M$ 

^匹配字符串的開始

$匹配字符串

\d的端部是一個數字

{2}是一個量詞,使得前一個字符需要2次

[AP]是一個字符類匹配AP

這正則表達式只是檢查格式,而不是如果數字代表一個有效的日期或時間!(例如99-99-0000 35:61 PM有效)

閱讀我的博客文章What absolutely every Programmer should know about regular expressions瞭解更多簡要信息。

0

試試這個:^(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])-((?:19|20)\d\d) ([0-1]?[0-9]|2[0-4]):([0-5][0-9])(?::([0-5][0-9]))?(AM|PM)$

^ Start of string 
    (0[1-9]|1[012]) Month 
    - 
    (0[1-9]|[12][0-9]|3[01]) Day 
    - 
    ((?:19|20)\d\d) Year 

    ([0-1]?[0-9]|2[0-4]) HH 
    : 
    ([0-5][0-9]) MM 
    (?::([0-5][0-9]))? optional :SS 
    (AM|PM) 
$ End of string 

它捕獲月,日,年,時,分,秒和AM/PM。

編輯:由於Vikas指出,它不檢查每月可以有多少天。

+3

它會高興地接受'02-31-2012 5:00 PM'作爲有效日期。 – Vikas

5

如果是數據,爲什麼不使用標準日期格式化程序來驗證它?像:

static constraints = { 
    mydate validator: { 
     try { 
     Date.parse('MM-dd-yyyy hh:mma', it) 
     return true 
     } catch (ParseException e) { 
     return false 
     } 
    } 
} 

順便說一句,在這種情況下Date可以解析不那麼有效日期(並將其轉換爲correnct超值,喜歡15am3pm)。如果您需要的有效的格式,您可以用原來的值進行比較:

static constraints = { 
    mydate validator: { 
     try { 
     Date date = Date.parse('MM-dd-yyyy hh:mma', it) 
     return Date.format('MM-dd-yyyy hh:mma', date) == it 
     } catch (ParseException e) { 
     return false 
     } 
    } 
} 

或者你可以使用SimpleDateFormat代替:

final static DateFormat DATEFORMAT = new SimpleDateFormat('MM-dd-yyyy hh:mma') 

static constraints = { 
    mydate validator: { 
     try { 
     Date date = DATEFORMAT.parse(it) 
     return DATEFORMAT.format(date) == it 
     } catch (ParseException e) { 
     return false 
     } 
    } 
} 
0

試試這個

\b(?:(?:(?:0?[469]|11)\-(?:0?(?:[1-9]|[12][0-9])|30)\-(?:1[7-9][0-9]{2}|200[0-9]|201[0-2]))|(?:(?:0?[13578]|1[02])\-(?:0?(?:[1-9]|[12][0-9])|3[01])\-(?:1[7-9][0-9]{2}|200[0-9]|201[0-2]))|(?:(?:0?2)\-(?:0?(?:[1-9]|1[0-9])|2[0-8])\-(?:1[7-9][0-9]{2}|200[0-9]|201[0-2]))) +(?:(?:(?:0?([0-9])|1[0-2])):(?:0?([0-9])|[1-5][0-9])(?:[AP]M))\b 

\b(?:(?:(?:0?[469]|11)\-(?:0?(?:[1-9]|[12][0-9])|30)\-(?:1[7-9][0-9]{2}|200[0-9]|201[0-2]))|(?:(?:0?[13578]|1[02])\-(?:0?(?:[1-9]|[12][0-9])|3[01])\-(?:1[7-9][0-9]{2}|200[0-9]|201[0-2]))|(?:(?:0?2)\-(?:0?(?:[1-9]|1[0-9])|2[0-9])\-(?:1[7-9][0-9]{2}|200[0-9]|201[0-2]))) +(?:(?:(?:0?([0-9])|1[0-2])):(?:0?([0-9])|[1-5][0-9])(?:[AP]M))\b 

注意:兩種模式都有一個共同的限制,如果monthfebruary,它將匹配無效dates。 If-else條件在某些正則表達式中被接受,但是算術操作不存在這樣的函數。可能在很遠或不遠的將來,這可以在一些正則表達式中實現,但我認爲這不是RegEx基本上的情況。

  1. 第一模式將找不到任何日期比28從二月份更大。它永遠不會匹配任何無效的日期。
  2. 其次與上面完全相同,但是對於它的編號是29

而我是衆所周知的關於這個問題不能完全通過使用正則表達式解決的事實。