regex - regulares - Partida de expresión regular para probar un año válido
regex replace online (13)
Años de 1000 a 2999
^[12][0-9]{3}$
Para 1900-2099
^(19|20)/d{2}$
Dado un valor, quiero validarlo para verificar si es un año válido. Mi criterio es simple, donde el valor debe ser un número entero con 4
caracteres. Sé que esta no es la mejor solución, ya que no permitirá años antes de 1000
y permitirá años como 5000
. Este criterio es adecuado para mi escenario actual.
Lo que se me ocurrió es
/d{4}$
Mientras esto funciona, también permite valores negativos.
¿Cómo me aseguro de que solo se permiten números enteros positivos?
Basándose en la respuesta @ r92, para los años 1970-2019:
(19[789]/d|20[01]/d)
En teoría, la opción de 4 dígitos es correcta. Pero en la práctica, podría ser mejor tener un rango de 1900-2099.
Además, debe ser un grupo no capturante. Muchos comentarios y respuestas proponen la captura de la agrupación que no es propiamente en mi humilde opinión. Porque para coincidir podría funcionar, pero para extraer coincidencias usando expresiones regulares extraerá números de 4 dígitos y números de dos dígitos (19 y 20) también debido a la paranthesis.
Esto funcionará para una coincidencia exacta utilizando grupos que no capturan:
(?:19|20)/d{2}
Esto funciona desde 1900 hasta 2099:
/(?:(?:19|20)[0-9]{2})/
La respuesta "aceptada" a esta pregunta es incorrecta y miope.
Es incorrecto porque coincidirá con cadenas como 0001
, que no es un año válido.
Es miope porque no coincidirá con ningún valor superior a 9999. ¿Ya hemos olvidado las lecciones del Y2K ? En cambio, usa la expresión regular:
^[1-9]/d{3,}$
Si necesita unir años en el pasado, además de años en el futuro, podría usar esta expresión regular para hacer coincidir cualquier entero positivo:
^[1-9]/d*$
Incluso si no espera fechas del pasado, puede usar esta expresión regular de todos modos, en caso de que alguien invente una máquina del tiempo y quiera llevarse su software con ellas.
Nota: Esta expresión regular coincidirá con todos los años, incluidos los anteriores al año 1, ya que normalmente se representan con una designación de BC en lugar de un entero negativo. Por supuesto, esta convención podría cambiar en los próximos milenios, por lo que su mejor opción es hacer coincidir cualquier entero positivo o negativo con la siguiente expresión regular:
^-?[1-9]/d*$
Necesita agregar un ancla de inicio ^
como:
^/d{4}$
Su regex /d{4}$
coincidirá con las cadenas que terminan con 4 dígitos . Entonces se aceptará una entrada como -1234
.
Al agregar el anclaje de inicio, usted hace coincidir solo las cadenas que comienzan y terminan con 4 dígitos, lo que significa que deben contener solo 4 dígitos.
Para probar un año en una cadena que contenga otras palabras junto con el año, puede usar la siguiente expresión regular: / b / d {4} / b
Podrías convertir tu número entero en una cadena. Como el signo menos no coincidirá con los dígitos, no tendrá años negativos.
Si necesita hacer coincidir YYYY o AAAAMMDD, puede usar:
^((?:(?:(?:(?:(?:[1-9]/d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:[2468][048]|[13579][26])00))(?:0?2(?:29)))|(?:(?:[1-9]/d{3})(?:(?:(?:0?[13578]|1[02])(?:31))|(?:(?:0?[13-9]|1[0-2])(?:29|30))|(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1/d|2[0-8])))))|(?:19|20)/d{2})$
Uso esta expresión regular en Java ^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|[2-9][0-9])[0-9]{2}$
Funciona desde 1900 hasta 9999
Utilizar;
^(19|[2-9][0-9])/d{2}$
para los años 1900 - 9999.
No hay necesidad de preocuparse por 9999 y en adelante. ¡AI ya estará haciendo toda la programación! Hehehehe
Puede probar su expresión regular en https://regex101.com/
También más información sobre grupos que no capturan (mencionados en uno de los comentarios anteriores) aquí http://www.manifold.net/doc/radian/why_do_non-capture_groups_exist_.htm
puede ir con algo como [ ^-]/d{4}$
: evita que el signo menos sea antes de sus 4 dígitos.
también puede usar ^/d{4}$
con ^
para capturar el comienzo de la cadena. Depende de su escenario en realidad ...
/ ^ / d {4} $ / Esto verificará si una cadena consta de solo 4 números. En este escenario, para ingresar un año 989, puede dar 0989 en su lugar.