Necesito validar una cadena de fecha para el formato dd/mm/yyyy
con una expresión regular.
Esta expresión regular valida dd/mm/yyyy
, pero no las fechas inválidas como 31/02/4500
:
^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$
¿Qué es una expresión regular válida para validar el dd/mm/yyyy
formato con soporte para años bisiestos?
pattern
que toma una expresión regular, y los navegadores se validan automáticamente contra la expresión regular sin usar ningún javascript. ¡Solo estableciendo una expresión regular en el atributo de patrón!Respuestas:
La expresión regular que pegó no valida los años bisiestos correctamente, pero hay uno que sí lo hace en la misma publicación . Lo modifiqué para tomar
dd/mm/yyyy
,dd-mm-yyyy
odd.mm.yyyy
.^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[13-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$
Lo probé un poco en el enlace que Arun proporcionó en su respuesta y también aquí y parece funcionar.
Editar 14 de febrero de 2019: eliminé una coma que estaba en la expresión regular que permitía fechas como
29-0,-11
fuente
DD/MM/YYYY
esto, esta expresión regular también aceptaDD/MM/YY
que no estoy seguro de que fuera en la intención inicial del póster. Si no desea admitir 'YY', elimine todos los?
cuantificadores opcionales .0?
con0
, y también elimina la última aparición de?
.?
que debe ser eliminado: reemplazar todo(?:1[6-9]|[2-9]\d)?
con(?:1[6-9]|[2-9]\d)
.He extendido la expresión regular dada por @Ofir Luzon para los formatos dd-mmm-AAAA, dd / mmm / AAAA, dd.mmm.YYYY según mi requisito. Cualquier otra persona con el mismo requisito puede referir esto
y probado para algunos casos de prueba aquí http://regexr.com/39tr1 .
Para una mejor comprensión de esta expresión regular, consulte esta imagen:
fuente
8888
es un año posible. Espero vivir a esa edad.Aviso:
Por lo tanto, funciona correctamente solo para [1901 - 2099] (Whew) 😊
dd / MM / aaaa:
Comprueba si año bisiesto. Los años de 1900 a 9999 son válidos. Solo dd / MM / aaaa
fuente
29/02/2100
no existe (2100 NO es un año bisiesto), pero todavía es aceptado por el patrón dado.prueba esto.
puede probar la expresión regular en http://www.regular-expressions.info/javascriptexample.html fácilmente.
fuente
30-02-2001
... de todos modos, gracias por la respuesta :)Sospecho que lo siguiente es tan preciso como se puede esperar sin saber cuándo la configuración regional del usuario cambió de los calendarios juliano a gregoriano.
Acepta '-', '/', o nada como separadores entre año, mes y día, sin importar el orden.
MMddyyyy:
ddMMyyyy:
aaaaMMdd:
Aparte del orden, todos estos son precisos para el calendario juliano (año bisiesto cada cuatro años) hasta 1700, cuando el calendario gregoriano diverge del juliano. Tiene dos problemas:
Esto se ha probado con la implementación del calendario de Java desde el año 0001 hasta el año 9999, con la única discrepancia de los 10 días mencionados anteriormente en 1582.
fuente
^([0-9]{4}[-/]?((0[13-9]|1[012])[-/]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-/]?31|02[-/]?(0[1-9]|1[0-9]|2[0-8]))|([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048])00)[-/]?02[-/]?29)$
. Probado con python: repl.it/repls/DependentBestChaptersPara aquellos que los ven y se confunden por completo, aquí hay un extracto de mi guión. Desafortunadamente, todo lo que hace es hacer coincidir los números válidos en una entrada de fecha y hora, y el 31 de febrero se marcará como válido, pero como muchos han dicho, regex realmente no es la mejor herramienta para hacer esta prueba.
Para que coincida con una fecha en el formato 'aaaa-MM-dd hh: mm' (o de hecho en el orden que desee)
El script anterior comienza construyendo un objeto regex. Luego encuentra todas las entradas cuyas identificaciones coinciden con cierto patrón y luego las recorre. No pruebo la primera entrada que encuentro (
if (e > 0)
).Un poco de explicación:
^
significa inicio del partido, mientras que$
significa final del partido.\d+
medios que coincida con una única o una secuencia contigua de números enteros, de modomyhtml_element_with_id_56_datetime
ymyhtml_element_with_id_2_datetime
coincidirán, peromyhtml_element_with_id_5a_datetime
no lo haránfuente
Aquí hay otra versión de regex que coincide con cualquiera de los siguientes formatos de fecha y permite omitir los ceros iniciales:
Expresión regular:
^[0-3]?[0-9].[0-3]?[0-9].(?:[0-9]{2})?[0-9]{2}$
Partidos:
1/1/11 or 1.1.11 or 1-1-11 : true 01/01/11 or 01.01.11 or 01-01-11 : true 01/01/2011 or 01.01.2011 or 01-01-2011 : true 01/1/2011 or 01.1.2011 or 01-1-2011 : true 1/11/2011 or 1.11.2011 or 1-11-2011 : true 1/11/11 or 1.11.11 or 1-11-11 : true 11/1/11 or 11.1.11 or 11-1-11 : true
Demo de Debuggex
fuente
13/13/2000
= coincidencias es verdadAquí escribí uno
dd/mm/yyyy
donde separador puede ser uno de-.,/
rango de año0000-9999
.Se trata de años bisiestos y está diseñado para sabores regex, que admiten lookaheads, capturando grupos y referencias. NO válido para tales como
d/m/yyyy
. Si es necesario, agregue separadores adicionales a[-.,/]
Prueba a regex101 ; como una cadena de Java:
explicado:
Consulte también las preguntas frecuentes sobre SO Regex ; Avísame si falla.
fuente
Encontré este reg ex aquí
Esto valida el formato
mm/dd/yyyy
y las fechas válidas correctamente (pero nom/d/yyyy
).Algunas pruebas
fuente
validará cualquier fecha entre
1900-2099
fuente
La siguiente expresión es agradable y fácil de manipular:
Se valida de acuerdo con el formato MM / dd / AAAA y permite el soporte de año bisiesto de 1960 a 2016. Si necesita el soporte de año bisiesto extendido, solo necesita manipular esta parte de la expresión:
Espero que esto te haya ayudado mucho
fuente
Otra respuesta que valida el día (dd) según el mes (mm) y el año (aaaa) (es decir, también valida el 29 de febrero en los años bisiestos) y permite años que van desde 0001 a 9999 (0000 en un año no válido según el gregoriano calendario)
fuente
Estoy trabajando con una API que solo acepta el formato MM / DD / AAAA. No pude encontrar ninguna otra publicación que tuviera años bisiestos tan bien como la respuesta de Ofir , por lo que la modifiqué y la vuelvo a publicar aquí para cualquiera que pueda necesitarla.
fuente
validará el
MM/DD/YYYY
formato con1960
a2028
si necesita extender el soporte para los años bisiestos, agregue
esto también es trabajo
si se puede cambiar el formato
mm-dd-yyyy
de reemplazar[/]
a[-]
comprobar también en línea http://regexr.com/fuente
Para la fecha MM / DD / AAAA puede usar
Verifica días y polillas adecuados.
Recuerde que puede verificar su expresión regular en
regex101
que recomiendo :)
¡Que te diviertas!
fuente
Esta expresión regular validará las fechas en formato:
30-12-2016 (mm-dd-aaaa) o 12-3-2016 (mm-d-aaaa) o 1-3-2016 (md-aaaa) o 1-30-2016 (m-dd-aaaa)
fuente
Sé que es una respuesta tangencial a la pregunta, pero si la intención de la pregunta es '¿cómo valido una fecha?', Entonces ¿por qué no intentar dejar que el lenguaje de programación haga todo el trabajo duro (si está utilizando un lenguaje que lata)?
por ejemplo en php
fuente