Expresiones regulares útiles

Las expresiones regulares son un gran invento que nos permiten validar de manera fácil una cadena e caracteres  Lamentablemente su sintaxis puede parecer algo esotérica lo que hace que mucha gente se líe al utilizarlas. A continuación van algunos de los ejemplos más comunes que utilizo en mis validaciones.

Las explicaciones de las expresiones regulares son la traducción de las ofrecidas por My RegexTester, lugar ideal donde hacer pruebas.

Código postal

El código postal en España son cinco números. Los dos primeros van del 01 al 52 y los tres restantes pueden ser cualquier valor numérico

0[1-9][0-9]{3}|[1-4][0-9]{4}|5[0-2][0-9]{3}

Explicación

------------------------------------------------------------------
	0		'0'
------------------------------------------------------------------
	[1-9]		cualquier carácter del '1' al '9'
------------------------------------------------------------------
	[0-9]{3}	cualquier carácter del '0' al '9'(3 veces)
------------------------------------------------------------------
|			O
------------------------------------------------------------------
	[1-4]		cualquier carácter del '1' al '4'
------------------------------------------------------------------
	[0-9]{4}	cualquier carácter del '0' al '9'(4 veces)
------------------------------------------------------------------
|			O
------------------------------------------------------------------
	5		'5'
------------------------------------------------------------------
	[0-2]		cualquier carácter del '0' al '2'
------------------------------------------------------------------
	[0-9]{3}	cualquier carácter del '0' al '9'(3 veces)
------------------------------------------------------------------

Fecha

Una fecha en formato día mes año con los siguientes separadores posibles: »,’/’,’ ‘ o ‘-‘. Se permiten tanto valores del tipo 1/1/2001 como 01/01/2001

Notad un detalle que casi nunca veo en expresiones regulares de otros ejemplos: el formato del primer separador se almacena para asegurar que el segundo separador es del mismo estilo. Es decir, valores como 12/12-2012 son incorrectos ya que, a pesar de que el primer y segundo separador tienen caracteres permitidos, no son iguales.

(?:0?[1-9]|[12][0-9]|3[01])([/ -\])(?:0?[1-9]|1[012])\1[12][0-9]{3}

Explicación

------------------------------------------------------------------
(?: 			agrupa pero no captura el valor
------------------------------------------------------------------
	0? 		'0' (opcional)
------------------------------------------------------------------
	[1-9]		cualquier carácter del '1' al '9'
------------------------------------------------------------------
|			O
------------------------------------------------------------------
	[12]		cualquier de los siguientes caracteres:
			'1', '2'
------------------------------------------------------------------
	[0-9]		cualquier carácter del '0' al '9'
------------------------------------------------------------------
|			O
------------------------------------------------------------------
	3		'3'
------------------------------------------------------------------
	[01]		cualquier de los siguientes caracteres:
			'0', '1'
------------------------------------------------------------------
) 			fin del grupo
------------------------------------------------------------------
(			agrupa y guarda el valor en 1:
------------------------------------------------------------------
	[/ -\]		cualquier de los siguientes caracteres:
			'/', ' ', '-', ''
------------------------------------------------------------------
)			fin del grupo 1
------------------------------------------------------------------
(?:			agrupa pero no captura el valor
------------------------------------------------------------------
	0?		'0' (opcional)
------------------------------------------------------------------
	[1-9]		cualquier carácter del '1' al '9'
------------------------------------------------------------------
|			O
------------------------------------------------------------------
	1		'1'
------------------------------------------------------------------
	[012]		cualquier de los siguientes caracteres:
			'0', '1', '2'
------------------------------------------------------------------
)			fin del grupo
------------------------------------------------------------------
\1			el valor que se guardó en el grupo 1
------------------------------------------------------------------
[12] 			cualquier de los siguientes caracteres:
			'1', '2'
------------------------------------------------------------------
[0-9]{3}		cualquier carácter del '0' al '9'(3 veces)
------------------------------------------------------------------

Email

Posiblemente uno de los patrones más utilizados. Fuente: Mykong

[_A-Za-z0-9-]+(?:\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(?:\.[A-Za-z0-9]+)*(?:\.[A-Za-z]{2,})

Explicación

------------------------------------------------------------------
[_A-Za-z0-9-]+		cualquiera de los siguientes caracteres:
			'_', 'A' a 'Z', 'a' a 'z', '0' a '9', '-'
			(una o más veces)
------------------------------------------------------------------
(?:			agrupa pero no captura el valor
------------------------------------------------------------------
	.		'.'
------------------------------------------------------------------
	[_A-Za-z0-9-]+	cualquiera de los siguientes caracteres:
			'_', 'A' a 'Z', 'a' a 'z', '0' a '9', '-'
			(una o más veces)
------------------------------------------------------------------
)*			fin del grupo (0 o más veces)
------------------------------------------------------------------
@			'@'
------------------------------------------------------------------
[A-Za-z0-9]+		cualquiera de los siguientes caracteres:
			'A' a 'Z', 'a' a 'z', '0' a '9'
			(una o más veces)
------------------------------------------------------------------
(?:			agrupa pero no captura el valor
------------------------------------------------------------------
	.		'.'
------------------------------------------------------------------
	[A-Za-z0-9]+	cualquiera de los siguientes caracteres:
			'A' a 'Z', 'a' a 'z', '0' a '9'
			(una o más veces)
------------------------------------------------------------------
)*			fin del grupo (0 o más veces)
------------------------------------------------------------------
(?:			agrupa pero no captura el valor
------------------------------------------------------------------
	.		'.'
------------------------------------------------------------------
	[A-Za-z]{2,}	cualquiera de los siguientes caracteres:
			'A' a 'Z', 'a' a 'z' (al menos 2 veces)
------------------------------------------------------------------
) fin del grupo 
------------------------------------------------------------------

DNI

Uno fácil. Nueve dígitos más una letra mayúscula o, si eres extranjero, una letra, siete números y otra letra. La letra del DNI se calcula mediante un algoritmo que es de sobras conocido pero que en este tipo de validaciones por patrones no se puede calcular.

Respecto a dicha validación, mucha gente no sabe es que existe alguna partida de DNIs que tienen la letra mal calculada (sin comentarios, pero supongo que a la mayoría no le sorprende). Si hacemos que la validación de la letra cuadre con el algoritmo un día nos encontraremos que una persona con un DNI legal no se puede dar de alta en nuestro sistema. Para solucionarlo es mejor que la comprobación de la letra se marque como un aviso pero que sea posible insertar un DNI con letra incorrecta para hacerle la vida más simple a esos pobres desdichados que van por el mundo con un DNI incorrecto.

[0-9A-Z][0-9]{7}[A-Z]

Explicación

------------------------------------------------------------------
[0-9A-Z]		cualquier carácter del '0' a '9', 
			'A' a la 'Z'
------------------------------------------------------------------
[0-9]{7}		cualquier carácter del '0' a '9' (7 veces)
------------------------------------------------------------------
[A-Z]			cualquier carácter de la 'A' a la 'Z'
------------------------------------------------------------------

Teléfono

Permite prefijo internacional (hasta 5 dígitos) que pueden estar precedidos de un carácter ‘+’ y pueden estar entre paréntesis, más el número en si. El número está en formato de dos números seguidos, espacio opcional, un ciclo de 6 números más espacio opcional y un número al terminar. De esta manera se permiten formatos como XXXXXXXXX, XXX XXX XXX, XX XXX XX XX o XXX XX XX XX .

(?:[+]?(?:[0-9]{1,5}|\x28[0-9]{1,5}\x29)[ ]?)?[0-9]{2}(?:[0-9][ ]?){6}[0-9]

------------------------------------------------------------------
(?:				agrupa pero no captura el valor
------------------------------------------------------------------
	[+]?			'+' (opcional)
------------------------------------------------------------------
	(?:			agrupa pero no captura el valor
------------------------------------------------------------------
		[0-9]{1,5}	cualquier carácter del '0' al '9'
				(1 a 5 veces)
------------------------------------------------------------------
	|			O
------------------------------------------------------------------
		\x28		carácter 40 ( '(' )
------------------------------------------------------------------
		[0-9]{1,5}	cualquier carácter del '0' al '9'
				(1 a 5 veces)
------------------------------------------------------------------
		\x29		carácter 41 ( ')' )
------------------------------------------------------------------
	)			fin del grupo
------------------------------------------------------------------
	[ ]?			' ' (opcional)
------------------------------------------------------------------
)?				fin del grupo
------------------------------------------------------------------
(?:				agrupa pero no captura el valor
------------------------------------------------------------------
	[0-9]			cualquier carácter del '0' al '9'
------------------------------------------------------------------
	[ ]?			' ' (opcional)
------------------------------------------------------------------
){8}				fin del grupo (repetir 8 veces)
------------------------------------------------------------------
[0-9]				cualquier carácter del '0' al '9'
------------------------------------------------------------------
Esta entrada ha sido publicada en Programación y etiquetada como , , , . Guarda el enlace permanente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *