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)
。
我有一个 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)
。