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

miércoles, 27 de abril de 2022

Regex de RFC (México)

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

Este post es para ayudar a los desarrolladores con las entradas de datos de RFC válidos cuando sean requeridos, en este caso la definición de RFC y forma de generarlo va hasta el final, primero las expresiones regulares (Que es lo que más nos importa).

Versión oficial del SAT

^[A-Z&Ñ]{3,4}[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[A-Z0-9]{2}[0-9A]$

Versión reducida de la versión oficial del SAT

^[A-Za-zñÑ&]{3,4}\d{6}\w{3}$

Versión siguiendo al pie de la letra las instrucciones del SAT, esta versión no permite la entrada de fechas incorrectas ni de años bisiestos erróneos , de igual manera impide un RFC con palabras altisonantes, el problema es que en la práctica, existen RFC con palabras altisonantes y con fechas mal formadas.

^(((?!(([CcKk][Aa][CcKkGg][AaOo])|([Bb][Uu][Ee][YyIi])|([Kk][Oo](([Gg][Ee])|([Jj][Oo])))|([Cc][Oo](([Gg][Ee])|([Jj][AaEeIiOo])))|([QqCcKk][Uu][Ll][Oo])|((([Ff][Ee])|([Jj][Oo])|([Pp][Uu]))[Tt][Oo])|([Rr][Uu][Ii][Nn])|([Gg][Uu][Ee][Yy])|((([Pp][Uu])|([Rr][Aa]))[Tt][Aa])|([Pp][Ee](([Dd][Oo])|([Dd][Aa])|([Nn][Ee])))|([Mm](([Aa][Mm][OoEe])|([Ee][Aa][SsRr])|([Ii][Oo][Nn])|([Uu][Ll][Aa])|([Ee][Oo][Nn])|([Oo][Cc][Oo])))))[A-Za-zñÑ&][aeiouAEIOUxX]?[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)))[a-zA-Z1-9]{2}[\dAa])|([Xx][AaEe][Xx]{2}010101000))$

Versión de validación caracter por caracter, esta ER es recomendable cuando se quiera validar mientras el usario tipea

^[A-Za-zñÑ&]{1,2}([A-Za-zñÑ&]([A-Za-zñÑ&](\d(\d(\d(\d(\d(\d(\w(\w(\w)?)?)?)?)?)?)?)?)?)?)?$

El Registro Federal de Contribuyentes (RFC) se genera con 12 o 13 caracteres alfanuméricos obtenidos del nombre completo o razón social en mayúsculas sin acentos ni diéresis y la fecha de nacimiento de cada persona o creacíón de la empresa, para ello se siguen las instrucciones y excepciones a continuación:

Instrucciones

1.- Espacios 1 al 4 (1 al 3 en caso de empresa) La letra inicial y la primera vocal interna del primer apellido, la letra inicial del segundo apellido y la primera letra del nombre.

2.- 5 al 10 (4 al 9 en caso de empresa) La fecha de nacimiento en el orden de año mes y día. Para el año se tomarán los dos últimos dígitos, cuando el mes o el día sea menor a diez, se antepondrá un cero.

3.- 11 al 13 (10 al 12 en caso de empresa) La homoclave es un conjunto de tres caracteres asignados exclusivamente por el SAT con la finalidad de evitar la duplicidad en el RFC, y así mantener el registro sin claves que puedan generar confusión para identificar a los contribuyentes.

Excepciones

1.- Si la letra inicial de alguno de los apellidos es Ñ, el sistema le asignará una "X" en su lugar.

2.- Cuando el nombre sea compuesto (formado por dos o más palabras), la clave se constituye con la letra inicial de la primera palabra, siempre que no sea MARIA, MA., MA, o JOSE, J, J. en cuyo caso se utilizará la segunda palabra.

3.- Si en los apellidos o en el nombre aparecieran caracteres especiales como diagonal (/), guión (-), o punto (.), se captura tal cual viene en el documento probatorio y se asignará una "X" en caso de que esa posición intervenga para la conformación del RFC.

4.- Apellidos compuestos, formados por más de una palabra, el RFC se conformará con la primera palabra del apellido.

5.- Cuando alguno de los apellidos o nombre es compuesto y la primera palabra de esta composición es una preposición, conjunción, o contracción (DA, DAS, DE, DEL, DER, DI, DIE, DD, EL, LA, LOS, LAS, LE, LES, MAC, MC, VAN, VON, Y) se elimina la primera palabra y se utiliza la siguiente del apellido o nombre.

6.- Si de las cuatro letras resulta una palabra altisonante, la segunda letra será sustituida por una "X".

7.- Con dos apellidos, si el primer apellido no tiene vocal interna, se le asignará una "X" en la segunda posición.

8.- Con un apellido, si no existe el segundo apellido, se asignará una "X" en la tercera posición.