2010-12-07 10 views
55

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.Igualación de expresiones regulares para probar un año válido

Lo que se me ocurrió es

\d{4}$

Aunque esto funciona también permite que los valores negativos.

¿Cómo me aseguro de que solo se permiten enteros positivos?

+0

fwiw creé un proyecto Node.js, [ to-regex-range] (https://github.com/jonschlinkert/to-regex-range) para crear automáticamente estos rangos. Es más difícil de lo que parece si necesita generar la expresión regular para probar durante un rango de años. – jonschlinkert

Respuesta

58

es necesario agregar un ancla de inicio ^ como:

^\d{4}$ 

Su expresión regular \d{4}$ coincidirá con cadenas que terminan con 4 dígitos. Por lo tanto, se aceptarán entradas como -1234.

Al agregar el anclaje de inicio, solo coincide con aquellas cadenas que comienzan y terminan en con 4 dígitos, lo que significa que deben contener solo 4 dígitos.

+1

¡Maldición! El mío era tan defectuoso que incluso habría aceptado 'whateverblahblah2323'. Ahora entiendo por qué un poco de aprendizaje es peligroso: O –

+37

Esto se romperá en el año 10,000. – sferik

+11

@sferik: No importa. El póster original indicó específicamente que quería verificar cuatro caracteres. No dijo que deseaba que el año 10,000 fuera una entrada válida, por lo que aceptar '10000' sería un error. – markusk

1

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 atrapar el comienzo de la cadena. Depende de su escenario realidad ...

126

años de 1000 a 2999

^[12][0-9]{3}$ 

Para 1900-2099

^(19|20)\d{2}$ 
+7

Esta es una solución mucho mejor –

+6

Es mejor usar un grupo que no captura: '^ (?: 19 | 20) \ d {2} $' –

+0

¿Cómo puedo validar un año de 4 dígitos entre 2011 y 2099? – mcquaim

0

Se 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.

17

La respuesta "aceptada" a esta pregunta es incorrecta y miope.

No es correcto, ya que coincidirá con cadenas como 0001, que no es un año válido.

Es miope en cuanto a que no coinciden con valores superiores a 9999. ¿Ya hemos olvidado las lecciones de Y2K? En su lugar, utilice la expresión regular:

^[1-9]\d{3,}$ 

Si usted necesita emparejar años en el pasado, además de años en el futuro, se podría utilizar esta expresión regular para que coincida con cualquier número entero positivo:

^[1-9]\d*$ 

Incluso si no espera fechas del pasado, puede 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 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 para que coincida con cualquier número entero positivo o negativo, con la siguiente expresión regular: Respuesta

^-?[1-9]\d*$ 
+10

wow. Si mi aplicación se ejecuta dentro de 8000 años ... –

+2

No, es probable que no lo haga. Pero alguien (¿arqueólogo, historiador?) Podría necesitar igualar años hace 8,000 años. : D Y Doc Brown podría necesitarlo ... – Jaime

+1

Lo usé para limitar el rango de 1000-9999^[1-9] \\ d {3} $ eso es porque la aplicación que tenemos que proporcionar datos, acepta números de 4 dígitos solamente :( – MatPag

5

Sobre la base @ R92, en los años 1970- 2019:

(19[789]\d|20[01]\d) 
+0

Su respuesta permite '197999' – avalanche1

+0

No lo hago Creo que sí ... La primera parte de la expresión regular coincide con el número que comienza con 19, luego con cualquiera de 7,8 o 9, seguido por un número ÚNICO. La expresión regular '19 [789] \ d \ d \ d' permitiría' 197999 ' – Renaud

+0

' /(19[789]\d|20[01]\d)/.test(1970324) >> verdadero' – avalanche1

0

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}$

Works desde 1900 a 9999

7

esto funciona para 1900-2099:

/(?:(?:19|20)[0-9]{2})/ 
+0

me parece que solo llegaría a 2099 Por cierto, el OP pregunta cómo solo permite el número positivo de 4 dígitos. – DeanOC

+0

bah, 2099 es lo que quise decir. Gracias. y ahora veo la parte positiva de los enteros. – jonschlinkert

+0

Creé un proyecto, [to-regex-range] (https://github.com/jonschlinkert/to-regex-range) para crear automáticamente estos rangos – jonschlinkert

0

/^ \ d {4} $/ Esto comprobará si una cadena se compone de sólo 4 números. En este escenario, para ingresar un año 989, puede dar 0989 en su lugar.

0

Para probar un año en una cadena que contiene otras palabras junto con el año se puede utilizar la siguiente expresión regular: \ b \ d {4} \ b

Cuestiones relacionadas