2009-08-31 61 views
13

Estoy tratando de validar una fecha ingresada en un cuadro de texto. Hay una máscara de entrada en el cuadro de texto que fuerza la entrada de xx/xx/xxxx. Intento usar un validador de expresiones regular para exigir que se ingrese una fecha correcta. No soy experto en RegEx bascialmente en absoluto. Mi compañero de trabajo encontró este en Internet, pero realmente no puedo decir lo que está haciendo.C# Expresión regular para validar una fecha?

¿Esto se ve bien? Parece demasiado complicado ...

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

¿Alguien sabe de una expresión menos compleja que esencialmente hace lo que necesito?

+0

Esto se ha tratado en [este] (http://stackoverflow.com/questions/669741/date-regex) publicación. Ve si ayuda. – JYelton

Respuesta

34

Por qué no utilizar uno de los métodos disponibles en la System.DateTime namespace? Se podría utilizar DateTime.TryParse() (edición:DateTime.TryParseExact() es probablemente la sugerencia derecha) para llevar a cabo la validación.

+1

De acuerdo, deje que el marco tire el peso en este caso. –

+4

y DateTime.TryParseExact() puede ser más apropiado dependiendo de sus necesidades exactas. –

+0

¿Qué pasa si quiero asegurarme de que la fecha sea correcta al hacer clic en el botón? – Muhammedh

20

Puede utilizar DateTime.TryParseExact:

DateTime dt; 

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

Esto no es realmente una respuesta, pero ¿no podría utilizar DateTime.Parse o DateTime.TryParse para comprobar que la fecha es correcta?

O eso o utilice un control DateTime para asegurarse de que no sea posible ingresar datos que no sean un DateTime. Hay muchos JavaScript disponibles sobre este tema.

3

Kettenbach tenía un problema. Su compañero de trabajo sugirió usar expresiones regulares. Kettenbach luego tuvo dos problemas.

Como han dicho otros, utilizar DateTime.TryParse o DateTime.TryParseExact en un validador personalizado y ahorrarse la pesadilla que es la expresión regular :)

+0

Regexes no son intrínsecamente malvados. Sin embargo, necesitan ser usados ​​juiciosamente. Funcionan muy bien para una cierta clase de problemas de análisis de texto. – TrueWill

+3

oh, nunca dije que fueran malvados, por decir ... Pero están al mismo nivel que los gatos. – Sk93

+0

Por favor, atribuya la declaración anterior a Jamie Zawinski. – jason

-1

Última respuesta es en realidad la forma correcta de hacerlo. Use DateTime.TryParse.

Ejemplo:

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

Estaba escribiendo un código real para él. – wwd

+1

TryParse realmente devuelve verdadero si el análisis fue exitoso, por lo que su notificación de formato de fecha no válida debe estar en el resto de esa condición. –

3

La expresión regular anterior es correcta para el formato dd/mm/aaaa. la expresión es

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

Creo que la pregunta era "¿hay una manera mejor" ... – iMortalitySX

7

Esto sería expresión regular correcta de utilizar el formato de fecha dd/mm/aaaa

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

No exactamente - tiene que hacer que el cero inicial sea opcional o no coincidirá con valores de un solo dígito como el 2/12/2012. ^ (0? [1-9] | [12] [0-9] | 3 [01]) [- /.](0[1-9]|1[012])[- /.] (19 | 20) \ d \ d $ – 5arx

3

Como alternativa, se puede utilizar en lugar de CompareValidator RegularExpressionValidator. Dice así:

<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

Muy buena idea. Me acabas de salvar de utilizar un Regex. – Cyberherbalist

0

Podemos utilizar un CustomValidator y utilizar la anulación del método ServerValidate para comprobar el 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] 

para dd/mm/aaaa (año puede ser 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]))

que incluye d/m/aa (ej. 1/12/82)

Cuestiones relacionadas