martes, 9 de septiembre de 2025

Expresión regular de Correo (Mejorada)

NOTA: Recuerden que si requieren ayuda con alguna Expresión regular, me pueden escribir y los apoyo sin problema.

La validación es la siguiente:

^[a-z](\.?[a-z\d_\-]){0,63}@[a-z]([_\-\.]?([a-z]\d?)?[a-z]){0,63}$

Este documento describe las reglas para validar correos electronicos de acuerdo con las especificaciones RFC 5321/5322 y las reglas de DNS

------------------------------------------------------------------------

## Reglas principales

### Parte local (antes de la @)

- Puede contener letras, numeros y caracteres especiales: `. _ -`
- No puede empezar ni terminar con `.`
- No puede tener dos puntos seguidos `..`
- Longitud maxima: **64 caracteres**

Ejemplos validos:

- `usuario@ejemplo.com`
- `nombre.apellido@dominio.org`
- `usuario@dominio.com`
- `nombre.apellido@ejemplo.org`
- `pepito123@empresa.net`
- `abc_def@dominio.co`
- `u@d.io`
- `mi-correo@sub.dominio.com`
- `contacto@empresa-aero.aero`
- `x@mi-dominio.space`
- `abc.def@ejemplo.travel`
- `bolt@perrito.xyz`
- `a@b.co`

Ejemplos invalidos:

- `pepito+promo@empresa.net`
- `.usuario@ejemplo.com`
- `usuario.@ejemplo.com`
- `usuario..prueba@ejemplo.com`
- `.usuario@ejemplo.com`
- `usuario.@ejemplo.com`
- `usuario..prueba@ejemplo.com`
- `usuario@-dominio.com`
- `usuario@dominio-.com`
- `bolt@perrito.3com`
- `algo@dominio.123`
- `nombre apellido@ejemplo.com`
- `user@do..main.com`
- `us..er@dominio.com`

------------------------------------------------------------------------

### Dominio (despues de la @)

- Se divide en **etiquetas** separadas por `.`
- Cada etiqueta:
- Debe comenzar y terminar con letra o numero
- Puede contener guiones `-` en medio (Ni al principio ni al final)
- Maximo **63 caracteres**
- Longitud total del dominio: **253 caracteres**
Ejemplos validos:

- `mi-dominio.com`
- `sub.dominio.org`
- `empresa-aero.aero`
Ejemplos invalidos:

- `-dominio.com` (correo@-dominio.com)
- `dominio-.com` (correo@dominio-.com)

------------------------------------------------------------------------

### TLD (ultima parte)

- Solo letras (no puede ser solo numeros)
- Longitud: 1 a 63 caracteres

Ejemplos validos:

- `.com`
- `.org`
- `.xyz`
- `.museum`
- `.space`
- `.coffee`

Ejemplos invalidos:

- `.123` (solo numeros)
- `.3com` (empieza con numero seguido de letras)

------------------------------------------------------------------------

## Ejemplos validos poco comunes

- `pepito@dominio.x`
- `user@sub.dominio.museum`
- `contacto@empresa-aero.aero`
- `bolt@perrito.xyz`
- `abc.def@ejemplo.travel`
- `x@mi-dominio.space`
- `a@b.co`

------------------------------------------------------------------------

## Ejemplos invalidos

- `bolt@perrito.3com`
- `algo@dominio.123`
- `.@ejemplo.com`
- `nombre..apellido@ejemplo.com`
- `usuario@-dominio.com`
- `usuario@dominio-.com`
- `yo+promo@ejemplo.email`
- `"nombre raro"@ejemplo.com`

------------------------------------------------------------------------

NOTA: No puse acentos porque el MD donde lo estaba haciendo no los acepta.

Agradecimientos especiales, en esta ocasión me estuvo apoyando mi equipo de trabajo

Yami
Fredy
Humano
Tili
Rober
Lalo
Néstor
Marcos

jueves, 4 de julio de 2024

Expresión regular Base64, Validación Base64, REGEX Base64

NOTA: Recuerden que si requieren ayuda con alguna Expresión regular, me pueden escribir y los apoyo sin problema.

La validación es la siguiente:

^(data:((video\/((mp4)|(ogg)))|(image\/((png)|(jpeg)|(gif)|(svg\+xml)))|(text\/((plain)|(html)|(css)|(javascript)))|(application\/((pdf)|(json)|(xml)))|(audio\/((mpeg)|(ogg))));base64,)?([a-zA-Z\d\+/=]{4})+$

Esta expresión regular valida los difentes tipos de archivos comunes en BASE64 los cuáles están enlistados más abajo, también valida que el BASE64 sea un múltiplo de 4, ya que es uno de los requisitos para que la cadena sea correcta, a nivel de código, esto nos ahorra contabilizar el número de caracteres y obtener el residuo el cual debe ser 0 al dividir entre 4 .

Imágenes:
PNG: data:image/png;base64,
JPEG: data:image/jpeg;base64,
GIF: data:image/gif;base64,
SVG: data:image/svg+xml;base64,


Textos:
Texto plano: data:text/plain;base64,
HTML: data:text/html;base64,
CSS: data:text/css;base64,
JavaScript: data:text/javascript;base64,


Documentos:
PDF: data:application/pdf;base64,
JSON: data:application/json;base64,
XML: data:application/xml;base64,


Archivos de audio:
MP3: data:audio/mpeg;base64,
Ogg: data:audio/ogg;base64,


Archivos de video:
MP4: data:video/mp4;base64,
Ogg: data:video/ogg;base64,

viernes, 3 de marzo de 2023

Expresión regular de periodos de tiempo

NOTA: Recuerden que si requieren ayuda con alguna Expresión regular, me pueden escribir y los apoyo sin problema.

Expresión regular para validar periodos de tiempo (Acepta fechas y periodos de tiempo en días, semanas, quincenas, meses, años)

^((19|20)(((([02468][048])|([13579][26]))[\/\-]02[\/\-]29)|(\d{2})[\/\-]((02[\/\-]((0[1-9])|1\d|2[0-8]))|((((0[13456789])|1[012]))[\/\-]((0[1-9])|((1|2)\d)|30))|(((0[13578])|(1[02]))[\/\-]31))))|([1-9]\d?\d? (([Mm][Ee][Ss]([Ee][Ss])?)|([Aa][Ññ][Oo][Ss]?)|([Ss][Ee][Mm][Aa][Nn][Aa][Ss]?)|([Qq][Uu][Ii][Nn][Cc][Ee][Nn][Aa][Ss]?)|([Dd][IiÍí][Aa][Ss]?))|(1 [Mm][Ee][Ss]))$

Esta validación acepta los periodos de tiempo ejemplificados a continuación:

    1.- Cualquier fecha real (Discrimina años bisiestos)
    2.- 1 día, 1 dia, 1 Día, 1 Dia, 1 DÍA, 1 DIA (Periodo de tiempo de 1 día, singular, acepta con y sin acento)
    3.- 2 días, 3 dias, 4 DIAS, 5 DÍAS, 6 Dias, 7 Días (Periodos de tiempo mayores a 1 día, plural, acepta con y sin acento)
    4.- 1 semana, 1 Semana, 1 SEMANA (Periodo de tiempo de 1 semana, singular)
    5.- 2 semanas, 3 Semanas, 4 SEMANAS (Periodos de tiempo mayores a 1 semana, plural)
    6.- 1 quincena, 1 Quincena, 1 QUINCENA (Periodo de tiempo de 1 quincena, singular)
    7.- 2 quincenas, 3 Quincenas, 4 QUINCENAS (Periodos de tiempo mayores a 1 quincena, plural)
    8.- 1 mes, 1 MES, 1 Mes (Periodo de tiempo de 1 mes)
    9.- 2 meses, 3 Meses, 4 MESES (Periodos de tiempo mayores a 1 mes, plural)
    10.- 1 año, 1 Año, 1 AÑO (Periodo de tiempo de 1 año, singular)
    11.- 2 años, 3 Años, 4 AÑOS (Periodos de tiempo mayores a 1 año, plural)

viernes, 8 de julio de 2022

Expresión regular Contraseña

NOTA: Recuerden que si requieren ayuda con alguna Expresión regular, me pueden escribir y los apoyo sin problema.

Y ahora el orgullo de mis Expresiones regulares, la validación de una contraseña (Abajo explico cómo funciona, y cómo podrían modificarlo a su conveniencia):

^[@#$%^\&\+=\dA-ZÑa-zñ]{0,}((([a-zñ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[A-ZÑ]+)|([A-ZÑ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[a-zñ]+))[@#$%^\&\+=\dA-ZÑa-zñ]{0,}\d+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[@#$%^\&\+=]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,})|((([a-zñ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[A-ZÑ]+)|([A-ZÑ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[a-zñ]+))[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[@#$%^\&\+=]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}\d+[@#$%^\&\+=\dA-ZÑa-zñ]{0,})|((([a-zñ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[@#$%^\&\+=]+)|([@#$%^\&\+=]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[a-zñ]+))[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[A-ZÑ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}\d+[@#$%^\&\+=\dA-ZÑa-zñ]{0,})|((([a-zñ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}\d+)|(\d+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[a-zñ]+))[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[A-ZÑ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[@#$%^\&\+=]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,})|((([@#$%^\&\+=]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[a-zñ]+)|([a-zñ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[@#$%^\&\+=]+))[@#$%^\&\+=\dA-ZÑa-zñ]{0,}\d+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[A-ZÑ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,})|((([A-ZÑ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[@#$%^\&\+=]+)|([@#$%^\&\+=]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[A-ZÑ]+))[@#$%^\&\+=\dA-ZÑa-zñ]{0,}\d+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[a-zñ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,})|(((\d+[a-zñ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[@#$%^\&\+=])|([a-zñ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}\d+))[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[@#$%^\&\+=]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[A-ZÑ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,})|((([A-ZÑ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}\d+)|(\d+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[A-ZÑ]+))[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[@#$%^\&\+=]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[a-zñ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,})|((([A-ZÑ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}\d+)|(\d+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[A-ZÑ]+))[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[a-zñ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[@#$%^\&\+=]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,})|((([A-ZÑ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[@#$%^\&\+=]+)|([@#$%^\&\+=]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[A-ZÑ]+))[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[a-zñ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}\d+[@#$%^\&\+=\dA-ZÑa-zñ]{0,})|((([@#$%^\&\+=]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}\d+)|(\d+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[@#$%^\&\+=]+))[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[a-zñ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[A-ZÑ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,})|((([@#$%^\&\+=]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}\d+)|(\d+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[@#$%^\&\+=]+))[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[A-ZÑ]+[@#$%^\&\+=\dA-ZÑa-zñ]{0,}[a-zñ]+)[@#$%^\&\+=\dA-ZÑa-zñ]{0,}$

NOTA: Es requerido poner una expresión extra para validar la longitud: (Se puede poner en una sola, pero asíes un poco más entendible)
.{8,50} <--- Esta valída únicamente la longitud de 8 a 50 caracteres.

Esta validación toma como premisa que se requiere un mínimo de:

    1.- Una mayúscula
    2.- Una minúscula
    3.- Un número
    4.- Un caracter especial

Pero ¿Por qué está tan grande esta validación con respecto a las demás validaciones "Del mercado"?
Fácil, esta ER validan las 16 permutaciones posibles(Básicas necesarias), es decir, tomando en cuenta que cada número es uno de lo que representa en el punto anterior, se vería así:

    1 3 4 2
    3 1 2 4
    2 3 4 1
    ...

En esta expresión se toma como razonamiento principal las 16 permutaciones posibles de los 4 tipos de caracteres, pero no necesariamente lleva ese orden, puede llevar entre cada segmento N cantidad de caracteres, si tomamos que WWW, XXX, YYY, ZZZ y AAA pueden ser 1 o más veces los caracteres básicos, pero siempre existiendo los 4 básicos.
    WWW 1 XXX 3 YYY 4 ZZZ 2 AAA
    WWW 3 XXX 1 YYY 2 ZZZ 4 AAA
    WWW 2 XXX 3 YYY 4 ZZZ 1 AAA

Para poder hacer el cambio de caracteres a los que uno desee, lo ideal es realizar un "replace" de los siguientes caracteres:

    1.- Una mayúscula [A-ZÑ] (Se puede agregar ÁÉÍÓÚÜ o quitar la Ñ)
    2.- Una minúscula [a-zñ] (Se pueden agregar áéíóúü o quitar la ñ)
    3.- Un número \d (Se puede sustitur por alguna expresión que no acepte algunas sucesiones
    4.- Un caracter especial [@#$%^\&\+=] (Se pueden sustituir, agregar, quitar o cambiar los caracteres) (Tomen en cuenta no aceptar caracteres como: ' ,ya que puede ser un riesgo de seguridad para sus Bases de datos)

NOTA: En algunos lenguajes se requiere escapar algunos caracteres, por ejemplo:
\\ en lugar de \
& en lugar de &

Con esta Expresión regular se ahorra procesamiento al querer validar una contraseña, y líneas de código, ya que tendría que hacerse una serie de validaciones y recorridos de cadena para saber si cumple con los requerimientos mínimos.

viernes, 13 de mayo de 2022

Regex Tarjeta Bancaria

NOTA: Recuerden que si requieren ayuda con alguna Expresión regular, me pueden escribir y los apoyo sin problema.

La validación es la siguiente:

^\d{10}(\d(\d{4}(\d(\d{2})?)?)?)?$

Esta expresión regular valida tarjetas con números de 10, 11, 15, 16 y 18 números, esto porque en la actualidad hay tarjetas válidas con esa cantidad de números diferentes.

lunes, 2 de mayo de 2022

Regex CURP (palabras altisonantes)

NOTA: Recuerden que si requieren ayuda con alguna Expresión regular, me pueden escribir y los apoyo sin problema.

Expresión regular proporcionada por el SAT

^[A-Z][AEIOUX][A-Z]{2}[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[MH]([ABCMTZ]S|[BCJMOT]C|[CNPST]L|[GNQ]T|[GQS]R|C[MH]|[MY]N|[DH]G|NE|VZ|DF|SP)[BCDFGHJ-NP-TV-Z]{3}[0-9A-Z][0-9]$

Expresión regular que valida palabras altisonantes y años bisiestos, además de las validaciones comunes

^\b(?!((([Pp][Ii]){2})|(([Pp][Oo]){2})|([MmLl][Oo][CcKk][Oo])|((([VvBb][Aa])|([Ll][Oo]))([CcKk][Aa]))|((([Ff][Aa])|([Ll][Ii])|([Mm][Uu]))([Ll][Oo]))|([Nn][Aa][Cc][AaOo])|([Tt][Ee][Tt][Aa])|([Ss][Ee][Nn][Oo])|([Rr][Oo][Bb][AaEeOo])|([Vv][Aa][Gg][AaOo])|([CcKk][Aa][CcKkGg][AaOo])|([BbGgVvWw][Uu][Ee][YyIi])|([Kk][Oo](([Gg][Ee])|([Jj][Oo])))|([CcKk][Oo](([Gg][EeIi])|([Ll][Aa])|([Jj][AaEeIiOo])))|([QqCcKk][Uu][Ll][Oo])|((([Ff][Ee])|([Jj][Oo])|([Pp][UuIi]))[Tt][Oo])|([Rr][Uu][Ii][Nn])|((([Pp][Uu])|([JjGg][Ee])|([Rr][Aa]))[Tt][Aa])|([Pp][Ee](([Dd][Oo])|([Dd][Aa])|([Nn][Ee])))|([Mm](([Aa][Mm][OoEe])|([EeIi][Aa][SsRr])|([Ii][Oo][Nn])|([Uu][Ll][Aa])|([Ee][Oo][Nn])))))[A-Za-z][AEIOUXaeioux][A-Za-z]{2}(((([02468][048])|([13579][26]))0229)|(\d{2})((02((0[1-9])|1\d|2[0-8]))|((((0[13456789])|1[012]))((0[1-9])|((1|2)\d)|30))|(((0[13578])|(1[02]))31)))[MHmh](([Mm][Nn])|([Hh][Gg])|([Vv][Zz])|([Yy][Nn])|([Cc][HhMm])|([Ss][PpRr])|([Dd][FfGg])|([Nn][EeTtLl])|([CcPpSsTt][Ll])|([QqGg][TtRr])|([AaBbCcMmTtZz][Ss])|([BbCcJjMmOoTt][Cc]))[BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz]{3}\w[\dAa]\b$

Fuente oficial sobre datos de CURP (Lista de palabras altisonantes en página 62):

http://www.gobernacion.gob.mx/work/models/SEGOB/Resource/231/1/images/InstructivoParaLaCurp_v2008.pdf?fbclid=IwAR3h6pqrEAO41nh2y83myemDbNkAkKl0dBz0kp37gAru3KGfa0QTm8-a5r0

jueves, 28 de abril de 2022

Regex de Fechas y/o Horas (Años bisiestos)

NOTA: Recuerden que si requieren ayuda con alguna Expresión regular, me pueden escribir y los apoyo sin problema.

Validación de fecha en formato: AAAA-MM-DD, esta expresión regular no permite fechas erróneas como 30 y 31 de febrero o 29 de Febrero en un año que no fue o será Bisiesto

^(19|20)(((([02468][048])|([13579][26]))-02-29)|(\d{2})-((02-((0[1-9])|1\d|2[0-8]))|((((0[13456789])|1[012]))-((0[1-9])|((1|2)\d)|30))|(((0[13578])|(1[02]))-31)))$

Validación hecha para un seguidor de fecha en formato: DD/MM/AAAA, esta expresión regular no permite fechas erróneas como 30 y 31 de febrero o 29 de Febrero en un año que no fue o será Bisiesto

^(29\/02\/(19|20)(([02468][048])|([13579][26])))|(((31\/((0[13578])|(1[02])))|(((0[1-9])|((1|2)\d)|30)\/((0[13456789])|1[012]))|(((0[1-9])|1\d|2[0-8])\/02))\/(19|20)\d{2})$

Validación de fecha en formato: AAAA-MM-DDTHH:MM:SS, esta expresión regular no permite fechas erróneas como 30 y 31 de febrero o 29 de Febrero en un año que no fue o será Bisiesto, el formato de horas es de 24 horas

^(19|20)(((([02468][048])|([13579][26]))-02-29)|(\d{2})-((02-((0[1-9])|1\d|2[0-8]))|((((0[13456789])|1[012]))-((0[1-9])|((1|2)\d)|30))|(((0[13578])|(1[02]))-31)))[Tt](([0-1]\d)|(2[0-3]))(:[0-5]\d){2}$

Validación de hora formato 24 horas sin segundos:

^(([0-1]\d)|(2[0-3])):[0-5]\d$

Validación de hora formato 24 horas con segundos:

^(([0-1]\d)|(2[0-3]))(:[0-5]\d){2}$

Validación de hora formato 12 horas sin segundos:

^((0[1-9])|(1[0-2])):[0-5]\d[aApP][mM]$

Validación de hora formato 12 horas con segundos:

^((0[1-9])|(1[0-2]))(:[0-5]\d){2}[aApP][mM]$