2009-08-31 15 views
13

Próbuję sprawdzić datę wprowadzoną w polu tekstowym. W polu tekstowym znajduje się maska ​​wejściowa, która wymusza wejście xx/xx/xxxx. Próbuję użyć walidatora wyrażeń regularnych, aby wymusić wprowadzenie poprawnej daty. W ogóle nie mam wprawy w RegEx. Mój współpracownik znalazł to w Internecie, ale nie mogę powiedzieć, co robi.C# Wyrażenie regularne do sprawdzania poprawności daty?

Czy to wygląda prawidłowo? Wydaje się zbyt skomplikowane ...

(^((((0[1-9])|([1-2][0-9])|(3[0-1]))|([1-9]))\x2F(((0[1-9])|(1[0-2]))|([1-9]))\x2F(([0-9]{2})|(((19)|([2]([0]{1})))([0-9]{2}))))$) 

Czy ktoś wie o mniej złożonej ekspresji, która w istocie robi to, czego potrzebuję?

+0

Zostało to zaadresowane w poście [this] (http://stackoverflow.com/questions/669741/date-regex). Sprawdź, czy to pomaga. – JYelton

Odpowiedz

34

Dlaczego nie skorzystać z jednej z metod dostępnych w System.DateTime namespace? Można użyć DateTime.TryParse() (DateTime.TryParseExact() jest prawdopodobnie odpowiednią sugestią), aby przeprowadzić walidację.

+1

Zgadzam się, pozwól ramie ciągnąć wagę na tym. –

+4

A DateTime.TryParseExact() może być bardziej odpowiedni w zależności od Twoich konkretnych potrzeb. –

+0

Co zrobić, jeśli chcę się upewnić, że data jest prawidłowa po kliknięciu przycisku? – Muhammedh

20

Można użyć DateTime.TryParseExact:

DateTime dt; 

bool isValid = DateTime.TryParseExact(
    "08/30/2009", 
    "MM/dd/yyyy", 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.None, 
    out dt); 
-1

Nie jest to odpowiedź, ale nie można użyć DateTime.Parse lub DateTime.TryParse aby sprawdzić, czy data jest poprawna?

Albo użyj kontrolki DateTime, aby upewnić się, że nie można wprowadzić danych, które nie są datami. Na ten temat jest dużo JavaScriptu.

3

Kettenbach miał problem. Jego współpracownik zasugerował użycie wyrażeń regularnych. Kettenbach miał wtedy dwa problemy.

Jak mówili inni, użyj DateTime.TryParse lub DateTime.TryParseExact na niestandardowym walidator i oszczędzić sobie koszmar, który jest regex :)

+0

Regeksy nie są z natury złe. Muszą być jednak rozsądnie używane. Doskonale sprawdzają się w przypadku niektórych klas problemów z analizą tekstu. – TrueWill

+3

oh Nigdy nie powiedziałem, że są złe, na przykład ... Ale są na poziomie z kotami. – Sk93

+0

Prosimy o przypisanie powyższego oświadczenia Jamie Zawinskiemu. – jason

-1

Ostatnia odpowiedź jest rzeczywiście poprawny sposób to zrobić. Użyj DateTime.TryParse.

przykład:

DateTime dt; 
if(DateTime.TryParse(Textbox1.Text,out dt)) 
{ 
Label1.Text = "Invalid date format"; 
} 
+1

Pisałem dla niego aktualny kod. – wwd

+1

TryParse faktycznie zwraca wartość true, jeśli analizowanie zakończyło się pomyślnie, więc powiadomienie o nieprawidłowym formacie daty powinno znajdować się w innym warunku. –

3

Powyższy wyrażeniem jest poprawna dla DD/mm/rrrr. wyrażenie jest

(^((((0[1-9])|([1-2][0-9])|(3[0-1]))|([1-9]))\x2F(((0[1-9])|(1[0-2]))|([1-9]))\x2F(([0-9]{2})|(((19)|([2]([0]{1})))([0-9]{2}))))$) 
+1

Sądzę, że pytanie brzmiało "czy jest lepszy sposób" ... – iMortalitySX

7

To byłoby poprawne wyrażenie regularne użyć do formatu daty dd/mm/rrrr

^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$ 
+4

Niezupełnie - należy wprowadzić początkowe zero jako opcjonalne lub nie będzie ono zgodne z wartościami jednocyfrowymi, takimi jak 2/12/2012. ^ (0? [1-9] | [12] [0-9] | 3 [01]) [- /.](0[1-9]|1[012])[- /.] (19 | 20) \ d \ d $ – 5arx

3

Jako alternatywę można użyć CompareValidator zamiast RegularExpressionValidator. To idzie tak:

<asp:CompareValidator ID="CompareValidator2" runat="server" ControlToValidate="txtIssueDate" ErrorMessage="Invalid Date Format" Type="Date" Operator="DataTypeCheck" Display="Dynamic" Text="*" ForeColor="Red" ValidationGroup="valGroup1"></asp:CompareValidator>

+0

Bardzo dobry pomysł. Właśnie uratowałeś mnie przed używaniem Regexa. – Cyberherbalist

0

Możemy użyć CustomValidator i użyć metody ServerValidate nadpisanie sprawdzić TryParse!

0
([0][1-9]|[1][0-9|][2][0-9]|[3][0-1])\/([0][1-9]|[1][0-2])\/[1-2][0-9][0-9][0-9] 

dla dd/mm/rr (roku może wynosić od 1000 do 2999)

lub

(([0], [1-9] | [2], [0-9] | [3] [0-1] | [1-9] | [1] [0-9])/([0] [1-9] | [1] [0-2] | [1-9])/([1-2] [0-9] [0-9] [0-9] | [0-9] [0-9]))

który obejmuje d/m/rr (np. 1/12/82)

Powiązane problemy