2017-01-03 3 views
0

У меня RegEx, что подтверждает дату вступления в Я хочу, чтобы:./мм DD/YYYY или ММДДГГГГ RegEx проверки

ММ/дд/гггг М/d/YYYY MM-dd- YYYY MdYYYY MM.DD.YYYY MdYYYY ММДДГГГГ

И несколько других вариантов.

Вот мое выражение:

^((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 к это единственное, что изменилось, потому что по той же причине вызывается в нескольких местах, ограничивая количество кода, который мне нужно настроить.

Я звоню это RegEx из этого случая утверждение, которое находится в моем обычае 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>" 

Это на фактической aspx.vb странице вызывающей TextBoxPlus (мой пользовательский контроль):

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. –