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 1000
y permitirá años como 5000
. Este criterio es adecuado para mi escenario actual.
Lo que se me ocurrió es
\d{4}$
Si bien esto funciona, también permite valores negativos.
¿Cómo me aseguro de que solo se permitan números enteros positivos?
regex
string
validation
string-matching
Ranhiru Jude Cooray
fuente
fuente
Respuestas:
Necesita agregar un ancla de inicio
^
como:^\d{4}$
Su expresión regular
\d{4}$
coincidirá con cadenas que terminen con 4 dígitos . Por lo tanto-1234
, se aceptarán entradas similares .Al agregar el ancla de inicio, solo coincide con las cadenas que comienzan y terminan con 4 dígitos, lo que significa que deben contener solo 4 dígitos.
fuente
whateverblahblah2323
. Ahora entiendo por qué un poco de aprendizaje es peligroso: O10000
sería un error.Años de 1000 a 2999
^[12][0-9]{3}$
Para 1900-2099
^(19|20)\d{2}$
fuente
^(?:19|20)\d{2}$
(19|20)\d{2}
a mi expresión regular para validar un formato de fecha de nacimiento? Esta es mi expresión regular/^[0-9]{1,2}\/(0[1-9])|(1[0-2])\/[0-9]{4}$/
. Quiero asegurarme de que el año siempre tenga 4 dígitos y comience a marchitarse 19 ** o 20 **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 en el sentido de que no coincidirá con ningún valor por encima de 9999. ¿Ya hemos olvidado las lecciones del año 2000 ? En su lugar, use la expresión regular:
^[1-9]\d{3,}$
Si necesita hacer coincidir años en el pasado, además de años en el futuro, puede usar esta expresión regular para hacer coincidir cualquier número entero positivo:
^[1-9]\d*$
Incluso si no espera fechas del pasado, es posible que desee utilizar esta expresión regular de todos modos, en caso de que alguien invente una máquina del tiempo y quiera llevarse su software con ellos.
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 BC en lugar de un número 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 número entero, positivo o negativo, con la siguiente expresión regular:
^-?[1-9]\d*$
fuente
Esto funciona de 1900 a 2099:
/(?:(?:19|20)[0-9]{2})/
fuente
Sobre la base de la respuesta de @ r92, para los años 1970-2019:
(19[789]\d|20[01]\d)
fuente
197999
19[789]\d\d\d
permitiría197999
/(19[789]\d|20[01]\d)/.test(1970324) >> true
1970
), no con los últimos 3. ¿Sobre qué(19[789]\d|20[01]\d)[^0-9]
? Eso coincidiría1970 324
pero no1970324
En teoría, la opción de 4 dígitos es correcta. Pero en la práctica, sería mejor tener un rango de 1900-2099.
Además, debe ser un grupo no capturador. Muchos comentarios y respuestas proponen capturar agrupaciones que no son adecuadas en mi humilde opinión. Porque para hacer 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 parántesis.
Esto funcionará para una coincidencia exacta utilizando grupos que no capturan:
(?:19|20)\d{2}
fuente
puede ir con algo como [
^-]\d{4}$
: evita que el signo menos-
esté antes de sus 4 dígitos.también puede usar
^\d{4}$
con^
para capturar el comienzo de la cadena. Depende de tu escenario en realidad ...fuente
Para probar un año en una cadena que contiene otras palabras junto con el año, puede usar la siguiente expresión regular: \ b \ d {4} \ b
fuente
Utilizar;
^(19|[2-9][0-9])\d{2}$
durante los años 1900 - 9999.
No hay necesidad de preocuparse por 9999 y en adelante: ¡¡AI estará haciendo toda la programación para entonces !!! Jejejeje
Puede probar su expresión regular en https://regex101.com/
También más información sobre los grupos que no capturan (mencionado en uno de los comentarios anteriores) aquí http://www.manifold.net/doc/radian/why_do_non-capture_groups_exist_.htm
fuente
Podría convertir su número entero en una cadena. Como el signo menos no coincidirá con los dígitos, no tendrá años negativos.
fuente
Yo 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}$
Obras desde 1900 hasta 9999
fuente
/ ^ \ d {4} $ / Esto comprobará si una cadena consta de solo 4 números. En este escenario, para ingresar un año 989, puede dar 0989 en su lugar.
fuente
Si necesita hacer coincidir AAAA 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})$
fuente
También puedes usar este.
([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)
fuente
00/00/2000
o31/02/1999
y muchas fechas más falsos.(0[1-9]|1[0-2])
es una expresión mucho mejor para el mes