Skip to content

Instantly share code, notes, and snippets.

@jaime-a-esquivel-a
Created January 26, 2023 19:59
Show Gist options
  • Save jaime-a-esquivel-a/780e7cdca758be2b054974c4d587fe2a to your computer and use it in GitHub Desktop.
Save jaime-a-esquivel-a/780e7cdca758be2b054974c4d587fe2a to your computer and use it in GitHub Desktop.
Regex para validar RFC

Expresión Regular para validar un RFC

La clave de Registro Federal de Contribuyentes asignada a personas físicas se compone de 13 caracteres.

Primera sección del RFC, Nombre

Comprende los primeros 4 caracteres que equivalen a 4 letras asignadas de la siguiente manera:

  • Caracter 1: Letra inicial de apellido paterno.
  • Caracter 2: Vocal inicial de apellido paterno. (primera vocal)
  • Caracter 3: Letra inicial de apellido materno.
  • Caracter 4: Letra inicial del nombre.

Segunda sección del RFC, Fecha de nacimiento

Comprende los siguientes 6 caracteres que equivalen a 6 números asignados de la siguiente manera:

  • Caracteres 5 y 6: Los últimos 2 digitos del año de nacimiento.
  • Caracteres 7 y 8: Mes de nacimiento a 2 dígitos.
  • Caracteres 9 y 10: Día de nacimiento a 2 dígitos.

Tercera sección del RFC, Homoclave:

Comprende los últimos 3 caracteres asignados de manera exclusiva para evitar duplicidad en el RFC.

  • Caracter 11: Letra o número.
  • Caracter 12: Letra o número.
  • Caracter 13: Letra o número.

Resumen

La siguiente expresión regular válida el formato de RFC descrito previamente:

/^([A-ZÑ&]{4}) ?(?:- ?)?(\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])) ?(?:- ?)?([A-Z\d]{2})([A\d])$/


Ejemplos de cadenas permitidas por la expresión regular:

  • EUAJ850315FW2
  • EUAJ-850315-FW2
  • EUAJ 850315 FW2
  • EUAJ - 850315 - FW2
  • EUAJ- 850315- FW2
  • EUAJ -850315 -FW2

Índice

Componentes de la expresión regular


Constructos de agrupación


Los contructos de agrupación representan secciones de la expresión regular delimitados por paréntesis "()". Comenzaremos explicando las partes principales de la expresión regular.
Tener identificados los constructos de agrupación nos ayudará en las siguientes secciones a entender con mayor claridad el resto de los componentes.

/^([A-ZÑ&]{4}) ?(?:- ?)?(\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])) ?(?:- ?)?([A-Z\d]{2})([A\d])$/

  • /^([A-ZÑ&]{4})
    Constructo de agrupación que comprende cualquier letra mayúscula "A-Z" incluida la "Ñ" y el caracter "&".
    Podemos notar además el anclaje "^" idicando que la cadena debe comenzar con este grupo y el cuantificador "{4}" indicando que debe contener 4 caracteres del grupo.

  • ?(?:- ?)?
    Constructo de agrupación que permite el uso opcional del caracter "-" o de un espacio " " en la cadena.

  • (\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01]))
    Constructo de agrupación que se puede descomponer en las siguientes sub-agrupciones:
    "\d{2}" sub-agrupación, debe contener 2 dígitos.
    "(?:0[1-9]|1[0-2])" sub-agrupación, debe contener un número de 2 dígitos con valor entre 01 y 12.
    "(?:0[1-9]|[12]\d|3[01])" sub-agrupación, debe contener un número de 2 dígitos con valor entre 01 y 31.

  • ([A-Z\d]{2})
    Constructo de agrupación que comprende cualquier letra mayúscula "A-Z" o cualquier dígito entre 0 y 9.
    Podemos notar además el cuantificador {2} indicando que se deben incluir 2 caracteres del grupo.

  • ([A\d])$/
    Constructo de agrupación que comprende cualquier letra amyúscula "A-Z" o número (sólo 1 caracter).
    Podemos notar además el anclaje "$" indicando que la cadena debe terminar con este grupo.

Anclajes


/^([A-ZÑ&]{4}) ?(?:- ?)?(\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])) ?(?:- ?)?([A-Z\d]{2})([A\d])$/

  • El caracter "^" indica que la cadena debe comenzar con algún valor del constructo de agrupación: "([A-ZÑ&]{4})".
  • El caracter "$" indica que la cadena debe terminar con algún valor del constructo de agrupación: "([A\d])".

Cuantificadores


/^([A-ZÑ&]{4}) ?(?:- ?)?(\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])) ?(?:- ?)?([A-Z\d]{2})([A\d])$/

  • "[A-ZÑ&]{4}" indica que debe contener 4 caracteres del constructo de agrupación "[A-ZÑ&]".
  • ?" indica que se permite tener 0 ó 1 caracteres de espacio " ".
  • "(?:- ?)?" indica que se permite tener 0 ó 1 caracteres ya sea guión medio "-" o espacio " ".
  • "\d{2}" indica que debe contener 2 caracteres del constructo de agrupación "\d".
  • "[A-Z\d]{2}" indica que debe contener 2 caracteres del constructo de agrupación "[A-Z\d]".

Expresiones entre corchetes


/^([A-ZÑ&]{4}) ?(?:- ?)?(\d{2}(?:0[1-9]|1[0-2])(?:0<[1-9]|[12]\d|3[01])) ?(?:- ?)?([A-Z\d]{2})([A\d])$/

Dentro de la expresión regular podemos encontrar las siguientes expresiones entre corchetes:

  • "[A-ZÑ&]" Inclyue cualquier letra mayúscula, ademas incliuye la letra "Ñ" y el caracter "&".
  • "[1-9]" Incluye cualquier digito del 1 al 9.
  • "[0-2]" Incluye los dígitos 0, 1 y 2.
  • "[12]" Incluye los dígitos 1 y 2.
  • "[01]" Incluye los dígitos 0 y 1.
  • "[A-Z\d]" Incluye cualquier letra mayúscula o cualquier dígito.
  • "[A\d]" Incluye la letra mayúscula A o cualquier dígito.

Clases de caracteres


/^([A-ZÑ&]{4}) ?(?:- ?)?(\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])) ?(?:- ?)?([A-Z\d]{2})([A\d])$/

Dentro de la expresión regular se usa en varias ocasiones la clase de caracter "\d" que incluye cualquier dígito numérico árabe. Es equivalente a "[0-9]".

El operador OR


/^([A-ZÑ&]{4}) ?(?:- ?)?(\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])) ?(?:- ?)?([A-Z\d]{2})([A\d])$/

Encontramos el operador OR "|" en las siguientes secciones de la expresión regular:

  • "(?:0[1-9]|1[0-2])" Encontrar el número "0" seguido de algún digito entre 1 y 9   Ó   encotrar el número "1" seguido de algún dígito entre 0 y 2.
    Validando así las opciones permitidas para un valor de mes.
  • "(?:0[1-9]|[12]\d|3[01])" Encontrar el número "0" seguido de algún digito entre 1 y 9   Ó   encotrar el número "1" o "2" seguido de algún dígito entre 0 y 9   Ó   encontrar el número "3" seguido del número 0 o 1.
    Validando así las opciones permitidas para un valor de día del mes.

Autor

Jaime Esquivel

e-mail: [email protected]

GitHub User: https://github.com/jaime-a-esquivel-a

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment