2009-08-31 13 views
13

Sto provando a convalidare una data inserita in una casella di testo. C'è una maschera di input sulla casella di testo che forza l'input di xx/xx/xxxx. Sto cercando di utilizzare un validatore di espressioni regolari per far rispettare l'inserimento di una data corretta. Non sono specializzato in RegEx in nessun caso. Il mio collega ha trovato questo su internet ma non so davvero cosa stia facendo.Espressione regolare C# per convalidare una data?

Questo sembra giusto? Sembra troppo complicato ...

(^((((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}))))$) 

Qualcuno sa di un'espressione meno complessa che essenzialmente fa ciò di cui ho bisogno?

+0

Questo è stato risolto in [questo] (http://stackoverflow.com/questions/669741/date-regex) post. Vedi se aiuta. – JYelton

risposta

34

Perché non utilizzare uno dei metodi disponibili nello System.DateTime namespace? È possibile utilizzare DateTime.TryParse() (modificare:DateTime.TryParseExact() è probabilmente il suggerimento corretto) per eseguire la convalida.

+1

D'accordo, lascia che la struttura tiri il peso su questo. –

+4

E DateTime.TryParseExact() potrebbe essere più appropriato in base alle proprie esigenze. –

+0

E se volessi assicurarmi che la data sia corretta al clic del pulsante stesso? – Muhammedh

20

È possibile utilizzare DateTime.TryParseExact:

DateTime dt; 

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

Questo non è davvero una risposta, ma non si potrebbe utilizzare DateTime.Parse o DateTime.TryParse per controllare che la data è corretta?

O utilizzare il controllo DateTime per accertarsi che sia impossibile immettere dati che non sono un DateTime. C'è un sacco di JavaScript là fuori su questo argomento.

3

Kettenbach ha avuto un problema. Il suo collega ha suggerito di usare espressioni regolari. Kettenbach ha quindi avuto due problemi.

Come altri hanno detto, usare DateTime.TryParse o DateTime.TryParseExact su un validatore personalizzato e risparmiare l'incubo che è regex :)

+0

I regex non sono intrinsecamente malvagi. Devono essere usati con giudizio, però. Funzionano perfettamente per una determinata classe di problemi di analisi del testo. – TrueWill

+3

oh non ho mai detto che fossero cattivi, per dire ... Ma sono all'altezza dei gatti. – Sk93

+0

Si prega di attribuire la dichiarazione di cui sopra a Jamie Zawinski. – jason

-1

Ultima risposta è in realtà il modo corretto di fare. Utilizzare DateTime.TryParse.

Esempio:

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

Stavo scrivendo il codice effettivo per questo. – wwd

+1

TryParse restituisce effettivamente true se l'analisi ha avuto esito positivo, quindi la notifica del formato di data non valido dovrebbe essere nel altro di quella condizione. –

3

L'espressione regolare precedente è corretta per il formato gg/mm/aaaa. l'espressione è

(^((((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

Credo che la domanda fosse "c'è un modo migliore" ... – iMortalitySX

7

Questo sarebbe corretto espressione regolare da utilizzare per il formato data gg/mm/aaaa

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

Non esattamente - è necessario rendere lo zero iniziale opzionale o non corrisponderà ai valori del giorno a cifra singola come il 2/12/2012. ^ (0? [1-9] | [12] [0-9] | 3 [01]) [- /.](0[1-9]|1[012])[- /.] (19 | 20) \ d \ d $ – 5arx

3

In alternativa, è possibile utilizzare al posto di CompareValidator RegularExpressionValidator. Va in questo modo:

<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

Ottima idea. Mi hai appena salvato dall'usare un Regex. – Cyberherbalist

0

Possiamo usare un CustomValidator e utilizzare l'override del metodo ServerValidate di verificare la 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] 

per gg/mm/aaaa (anno può essere 1000-2999)

o

(([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]))

che include d/m/yy (ad es. 1/12/82)

Problemi correlati