2017-01-03 11 views
0

私はそれができるようにしたい何で来た日付を検証正規表現があります。MM/DD/YYYYまたはMMDDYYYY正規表現の検証

MM/DD/YYYY M/D/YYYY MM-DD- YYYY MdYYYY MM.DD.YYYY MdYYYY 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

です同じ理由で複数の場所で呼び出されているため、調整する必要があるコードの量が制限されているため、変更された唯一のものである必要があります。

私は私のカスタムTextBoxPlus.ascxにあるこのCaseステートメントからこの正規表現を呼んでいる:

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 
+0

Yikes、私はそれぞれを別々の正規表現に分割して、すべての検証コードを独自のメソッド/関数のどこかに入れます。 – 4castle

+4

その正規表現はばかげている。私がそれを維持しなければならないと、私はあなたを追跡し、頭の中であなたを蹴ります。標準化する方が良いです。あなたが望む* one *形式を選び、その形式へのユーザーの入力を操作します。バリデーションは唯一の懸念事項ではありません。これらの異なる日付形式を合理的な方法で提示することは、他のすべてのメンテナンスの悪夢となります。 –

+0

面白い話、これは私がきれいにしようとしている古い正規表現です –

答えて

3

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 

は、あなたは存在する場合、解析された日付を取得することが望ましい場合Nullable(Of DateTime)を返す関数を得ることができます。

+0

私は実際にそれに似た何かをやっています。 –

+0

@KevinFischer検証式がJavaScriptで動作する必要があると言っていますか?もしそうなら、本当に単純な正規表現を使って実際のチェックをサーバー上のコードビハインドに任せておくことをお勧めします。 –

+0

私はJSを使用していません。 –