Mostrando entradas con la etiqueta expresiones regulares. Mostrar todas las entradas
Mostrando entradas con la etiqueta expresiones regulares. Mostrar todas las entradas

jueves, 20 de diciembre de 2012

Expresiones Regulares | Operaciones


Concatenación
El símbolo | es para la operación de concatenación, esta operación se realiza de la forma R1|R2. Es equivalente a un O lógico.
Ejemplo
(Hola|Adios) valida la secuencia Hola, Adios y HolaAdios.

Cero o mas repeticiones
El símbolo * es el operador de clausura. Indica cero o mas repeticiones.
Esta operación se realiza de la forma R*.
Ejemplo
[a]\d* valida a, a1, a12 y a123 y no valida a 1 ni a 12.

Una o más repeticiones
El símbolo + es el operador de clausura positiva, donde R+ indica una o más repeticiones del patrón R.
Ejemplo
[a]\d+ valida a1, a12 y a123 y no valida a ni 1 ni 12.

Opcionalidad
El símbolo ? es el operador de opcionalidad R? e indica que R es opcional.
Ejemplo 
abc? solo valida ab, abc.
a(bc)? sirve para validar a a y abc.

Repeticiones fijadas por el usuario
R{n} indica n repeticiones del patrón R.
R{n,m} indica entre n y m repeticiones de R.
R{n,} indica n o mas repeticiones de R.
Ejemplos
[a]{3} solo valida aaa.
[a]{1,3} solo valida a, aa y aaa.
[a]{3,} valida aaa, aaaa, aaaaa en adelante, tantas como se quiera.

Expresiones Regulares | Sintaxis


Rango de caracteres
[c1-c2] describe el conjunto de caracteres dado por un rango.
Ejemplos
[0-9] es el conjunto de los dígitos desde el 0 hasta el 9.
[a-z] es el conjunto de caracteres en minúsculas de la a la z.
[A-Z] es el conjunto de caracteres en mayúsculas de la A la Z.
[a-zA-Z] es el conjunto de todas las letras minúsculas y mayúsculas.

Conjunto de dígitos
\d describe el conjunto de todos los dígitos decimales. Es la abreviatura de [0-9]
Ejemplos
\d\d valida números del 00 al 99
\d\d\d valida números desde el 000 hasta el 999.

 Conjuntos de letras
\p{L} describe al conjunto de letras Unicode (mayúsculas y minúsculas).
\p{LI} describe solo al conjunto de letras Unicode minúsculas.
\p{Lu} describe solo al conjunto de letras Unicode mayúsculas.
Ejemplos
\p{L}+ valida cadenas como Hola, hola y HOLA.
\p{LI}+ valida cadenas como hola y no valida Hola.
\p{Lu}+ valida cadenas como HOLA y no valida cadenas como Hola.

domingo, 16 de diciembre de 2012

Expresiones Regulares | Reconocer matriculas de coches


Esta Expresión Regular es para reconocer las matriculas de los coches. Como hoy en día hay tanto matriculas antiguas como nuevas (formato europeo), tenemos que hacer una expresión que acepte los dos formatos, respectivamente MU1111AB y E1111ABC. Y no están permitidos los guiones separadores ni espacios en blanco.

Formato antiguo
([A-Z]{1,2}) : Así se cogen letras mayúsculas de la A a la Z, como mínimo puede ser una letra, como máximo pueden ser dos letras.

(\d{4}) : Para coger cuatro dígitos, tienen que ser cuatro, ni uno mas ni uno menos.

([A-Z]{0,2}) : Coger de cero a dos letras mayúsculas, es decir el mínimo es cero y el máximo es dos.

Formato Europeo
(E) : Con E indicamos que forzosamente tiene que haber una y solo una E.

(\d{4}) : Igual que antes, para coger cuatro dígitos.

([A-Z]{3}) : Para coger tres letras mayúsculas, ni una mas ni una menos.


Luego tenemos dos expresiones regulares, una para el formato antiguo y otra para el formato Europeo. Ambas son de la siguiente forma.

Formato antiguo: ([A-Z]{1,2})(\d{4})([A-Z]{0,2})

Formato Europeo: (E)(\d{4})([A-Z]{3})

Para terminar, haciendo una concatenación de ambas podemos aceptar los dos formatos sin problemas.

Una concatenación se hace así: R1|R2

Luego el resultado de la concatenación de las dos expresiones regulares es el siguiente:

(([A-Z]{1,2})(\d{4})([A-Z]{0,2}))|((E)(\d{4})([A-Z]{3})

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

martes, 4 de diciembre de 2012

Expresiones Regulares | Reconocer nombres


Vamos a crear una expresión regular para reconocer nombres y apellidos, tanto compuestos como no compuestos con el siguiente formato:

Apellido1 Apellido2, Nombre. 

Donde Apellido2 puede ser simple o compuesto y tener los prefijos 'de', 'de la' o la forma Apellido2-Apellido3.

Y el nombre puede ser simple o compuesto de la forma Nombre1 Nombre2.

Introducción:
\p{L}+ : Para aceptar palabras con letras mayúsculas y minúsculas.
[ ] : Aceptar espacios en blanco
R? : Operador de opcionalidad, puede darse R o no.
[,] : Aceptar una coma.
de : Aceptar la cadena de.
la : Aceptar la cadena la.
1. E.R. para aceptar los dos apellidos donde el segundo apellido es opcional.

(\p{L}+)(([ ])(\p{L}+))?

Está formada por dos expresiones donde la primera coge el primer apellido, la segunda coge el segundo apellido y el espacio de separación entre los dos apellidos.
Si también queremos coger apellidos compuestos como Quijote de la Mancha, O separados por guion: Fernandez-Cortazar, entonces tenemos que añadir al final de la expresión anterior esta otra.

((([-])(\p{L}+))|((\p{L}+ )(de)(( la)?)( \p{L}+)))?

2. E.R. para aceptar nombres no compuestos.

([,])([ ])(\p{L}+)

Nótese que [,] y [ ] hacen que el nombre quede separado de los apellidos de la siguiente forma: Fernández-Cortázar, Paco
Para finalizar la E.R. para aceptar nombres compuestos donde el segundo nombre es opcional es de la forma:

(([ ])(\p{L}+))?                   

La expresión anterior hay que juntarla con esta expresión para reconocer nombres compuestos y no compuestos.
Resumiendo, la expresión resultante de juntar por orden cada una de estas expresiones es la siguiente:

Apellidos simples

(\p{L}+)(([ ])(\p{L}+))?

Apellidos compuestos

((([-])(\p{L}+))|((\p{L}+ )(de)(( la)?)( \p{L}+)))?

Nombres compuestos

([,])([ ])(\p{L}+)(([ ])(\p{L}+))?