domingo, 16 de diciembre de 2012

Expresiones Regulares | Reconocer DNI


Vamos crear una expresión regular para leer números de DNI y de NIE (extranjeros).
El formato para el DNI es de la forma a la que estamos acostumbrados:
11223344-A. Y el formato para el NIE es de la forma X-1223344-A, donde el primer carácter pueden ser las detrás X, Y o Z.
El guión separador es opcional.

Formato para extranjeros:
[X-Z]{1} : Así acepta solo una letra mayúscula de la X a la Z.

[-]? : Así se permite introducir un guión opcional.

\d{7} : Así se cogen siete dígitos cualesquiera.

[-]? : Guión opcional.

[A-Z]{1} : Así se coge la ultima letra, solo puede ser una.

Formato para españoles:
\d{8} : Coger 8 dígitos.

[-]? : Igual que antes.

[A-Z]{1} : Como antes, coge la ultima letra mayúscula.

Luego la expresión regular para aceptar NIE extranjeros es la siguiente:

([X-Z]{1})([-]?)(\d{7})([-]?)([A-Z]{1})

Y la expresión regular para aceptar DNI españoles es esta:

(\d{8})([-]?)([A-Z]{1})

Para terminar lo ideal es tener una expresión regular que permita coger tanto DNI de españoles como de extranjeros, luego hay que concatenar ambas expresiones para formar una expresión mas potente. El resultado es este:

(([X-Z]{1})([-]?)(\d{7})([-]?)([A-Z]{1}))|((\d{8})([-]?)([A-Z]{1}))

7 comentarios:

  1. Crystal clear which is not often the case of this kind of ressources! many thanks.

    ResponderEliminar
  2. Lyonel thank you very much that's what we try to achieve in computersandprogrammes.

    ResponderEliminar
  3. Muchas gracias por la información. Muy útil!!

    ResponderEliminar
  4. Buenas tardes muchas gracias por la información, sin embargo quisiera saber si existe una expresión para limitar solo el registro de 18 caracteres y que cuando se pase por ejemplo a 19 marque error con el codigo (\d{8})([-]?)([A-Z]{1}) muchas gracias por su atención.

    ResponderEliminar
  5. Para aceptar mayusculas y/o minusculas, esto seria correcto?

    (([X-Zx-z]{1})([-]?)(\d{7})([-]?)([A-Za-z]{1}))|((\d{8})([-]?)([A-Za-z]{1}))

    ResponderEliminar