簡體   English   中英

正則表達式以dd / mm / yy格式匹配日期並檢查有效值

[英]Regular Expression to match dates in dd/mm/yy format and check for valid values

有沒有人有一個regurlar表達式,它只接受格式為dd / mm / yy的日期,但也有嚴格的檢查以確保日期有效,包括閏年支持?

我在vb.net編碼,我正在努力解決這個問題。

我不認為閏年支持在正則表達式中是可行的而不使用一些丑陋的正則表達式。

在使用正則表達式驗證輸入后,您必須檢查日期有效性。

正如Keeper暗示的那樣,您可以使用DateTime.ParseExact方法來驗證日期:

Public Function IsValidDate(ByVal dateString As String) As Boolean
    Try
        DateTime.ParseExact(dateString, "dd/MM/yy", System.Globalization.CultureInfo.InvariantCulture)
        Return True
    Catch ex As FormatException
        Return False
    End Try
End Function

除了這樣一個正則表達式是一個長期骯臟的不可維護的事實,如果它存在,你甚至不能確定YY格式的一年是否是閏年。 當且僅當它是400的倍數時, 00才是飛躍。2000年是飛躍,1900年沒有飛躍。

以下正則表達式確保日期在01到31之間,月份在01到12之間,年份在1900到2099之間。刪除(?:19|20)部分使其為dd/mm/yy格式:然后年份可以使用標准的日期時間庫進行真正的驗證 - 使用正則表達式進行客戶端驗證(保存到服務器的行程 - 假設您在服務器上進行日期時間驗證),或者作為在喂食真實驗證器之前進行篩選試驗。

^(0[1-9]|[12]\d|3[01])/(0[1-9]|1[0-2])/((?:19|20)\d{2})$

這將是艱難的,或丑陋的,維護的噩夢,甚至是不可能的。

只需在Regex驗證后簽入代碼。

不需要使用正則表達式,因為已經有一個日期解析函數: DateTime.ParseExact

我認為用年度表達來檢查一年是否跳躍是非常困難的。 請查看有關您的問題的這篇文章 這是一個來自這里的城市:

同樣,您想要制作正則表達式的復雜程度取決於您使用它的數據,以及如果不需要的匹配滑過的問題有多大。 如果要驗證用戶在腳本中輸入日期,則可能更容易在正則表達式之外執行某些檢查。 例如,在年份不是閏年的2月29日之外,使用腳本語言要容易得多。 使用簡單的算法比使用正則表達式檢查一年是否可被4整除(並且除非可被100整除,除非可被400整除)要容易得多。

你可能最好只在regex中進行格式驗證並分別處理日期驗證。

你正試圖使用​​正則表達式錘來解決一個非常不釘形的問題。

使用正則表達式提取數字不是更好,但是以編程方式驗證它嗎?

無需驗證格式,因為“解析”方法將為您執行此操作。 解析將比較DateTimeFormatInfo中的所有日期格式字符串與傳遞給方法的字符串。 parse-exact方法只會將指定的字符串與傳遞給方法的數據格式字符串進行比較。

Imports System.Globalization

Module Sample

    Public Function IsValidDateString1(ByVal s As String) As Boolean
        Return Date.TryParseExact(s, "dd/MM/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, Nothing)
    End Function

    Public Function IsValidDateString2(ByVal s As String) As Boolean
        Static _dateFormats() As String = New String() {"dd/MM/yy", "d/M/yy", "d/M/yyyy"}
        Return Date.TryParseExact(s, _dateFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, Nothing)
    End Function

    Public Sub Main()
        Debug.WriteLine("single")
        Debug.WriteLine(IsValidDateString1("31/12/2001")) 'wrong format
        Debug.WriteLine(IsValidDateString1("31/12/01"))
        Debug.WriteLine(IsValidDateString1("29/2/08"))  '<-be careful
        Debug.WriteLine(IsValidDateString1("29/ 2/08")) '<-be careful
        Debug.WriteLine(IsValidDateString1("29/02/08"))
        Debug.WriteLine(IsValidDateString1("29/02/09")) 'invalide date
        Debug.WriteLine("multiple")
        Debug.WriteLine(IsValidDateString2("31/12/2001"))
        Debug.WriteLine(IsValidDateString2("31/12/01"))
        Debug.WriteLine(IsValidDateString2("29/2/08"))
        Debug.WriteLine(IsValidDateString2("29/ 2/08")) '<-be careful
        Debug.WriteLine(IsValidDateString2("29/02/08"))
        Debug.WriteLine(IsValidDateString2("29/02/09")) 'invalid date
    End Sub

End Module

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM