mm/DD/YYYY 或 mmDDYYYY 正则表达式验证

mm/DD/YYYY or mmDDYYYY RegEx Validation

我有一个 RegEx 来验证进入的日期。我希望它允许:

MM/dd/YYYY M/d/YYYY MM-dd-YYYY M-d-YYYY MM.dd.YYYY M.d.YYYY MMddYYYY

还有一些其他变体。

这是我的表达:

^((0[1-9]|1[012])[- /.]?(0[1-9]|[12][0-9]|3[01])[- /.]?(19|20)\d\d)|((((0?[13578])|(1[02]))[- /.]?((0?[1-9])|([12][0-9])|(3[01]))|((0?[469])|(11))[- /.]?((0?[1-9])|([12][0-9])|(30))|(0?[2])[- /.]?((0?[1-9])|([1][0-9])|([2][0-8])))[- /.]?(19\d{2}|20\d{2}))|(((0?[2]))[- /.]?((0?[1-9])|([12][0-9]))[- /.]?((19|20)(04|08|[2468][048]|[13579][26])|2000))$

我让大多数人上班,但我不想上班的日期是 MdYYYY、MMdYYYY 或 MddYYYY

我希望 RegEx 成为唯一改变的东西,因为它出于同样的原因在多个地方被调用,限制了我需要调整的代码量。

我从这个 Case 语句中调用这个正则表达式,这是我的自定义 TextBoxPlus.ascx:

Case TextBoxPlusType.DateOnlyMMDDYYYY
WatermarkText = "mmddyyyy"
ValidationExpression = "^((0[1-9]|1[012])[- /.]?(0[1-9]|[12][0-9]|3[01])[- /.]?(19|20)\d\d)|((((0?[13578])|(1[02]))[- /.]?((0?[1-9])|([12][0-9])|(3[01]))|((0?[469])|(11))[- /.]?((0?[1-9])|([12][0-9])|(30))|(0?[2])[- /.]?((0?[1-9])|([1][0-9])|([2][0-8])))[- /.]?(19\d{2}|20\d{2}))|(((0?[2]))[- /.]?((0?[1-9])|([12][0-9]))[- /.]?((19|20)(04|08|[2468][048]|[13579][26])|2000))$"
ErrorMessage = "Please enter a valid date format<br><b>mm/dd/yyyy<br>mmddyyyy</b>"

这是在调用 TextBoxPlus(我的自定义控件)的实际 aspx.vb 页面上:

If (Not (Date.TryParseExact(IssueDate.Text, "MMddyyyy", System.Globalization.DateTimeFormatInfo.InvariantInfo, Globalization.DateTimeStyles.None, New Date))) Then
If (Not (Date.TryParseExact(IssueDate.Text, "MM/dd/yyyy", System.Globalization.DateTimeFormatInfo.InvariantInfo, Globalization.DateTimeStyles.None, New Date))) Then
    showIfBadDate.Visible = True
    BadDate_AM.Show()
Else
IssueDate_ = Date.ParseExact(IssueDate.Text, "MM/dd/yyyy", System.Globalization.DateTimeFormatInfo.InvariantInfo)
End If
Else
IssueDate_ = Date.ParseExact(IssueDate.Text, "MMddyyyy", System.Globalization.DateTimeFormatInfo.InvariantInfo)
End If

如果您在几个地方使用它,最好使用一个函数来确定字符串作为可接受格式的日期的有效性:

Option Infer On
Option Strict On

Imports System.Globalization

Module Module1

    Function IsValidDate(s As String) As Boolean
        Dim validFormats = {"MM/dd/yyyy", "M/d/yyyy", "MM-dd-yyyy", "M-d-yyyy", "MM.dd.yyyy", "M.d.yyyy", "MMddyyyy"}
        Dim dt As DateTime
        Dim ci As New CultureInfo("en-US")

        Return DateTime.TryParseExact(s, validFormats, ci, DateTimeStyles.None, dt)

    End Function

    Sub Main()
        Dim stringsToTry = {"01/31/2016", "1/31/2016", "01-31-2016", "1-9-2016", "01.31.2016", "1.9.2016", "01312016", "112016", "1212016", "1122016"}

        For Each s In stringsToTry
            Console.WriteLine("{0,-10}: {1}", s, IsValidDate(s))
        Next

        Console.ReadLine()

    End Sub

End Module

输出:

01/31/2016: True
1/31/2016 : True
01-31-2016: True
1-9-2016  : True
01.31.2016: True
1.9.2016  : True
01312016  : True
112016    : False
1212016   : False
1122016   : False

稍作改动,如果需要获取已解析的日期(如果存在),您可以将函数设为 return Nullable(Of DateTime)