Rexact
Cheatsheet

Regex Mexican CURP

A CURP has 18 characters: 4 initials, a YYMMDD date, the sex, one of 33 state codes, 3 internal consonants, a homonymy character and a numeric check. Real attempts settle for letter classes: python-stdnum's regex accepts sex 'Q' and a vowel where a consonant belongs, the npm validate-curp library's accepts month 13 and state 'QQ', and the SAT library satcfdi's, good on states, accepts February 30. Here's a pattern bounding months, days per month and the 33 states, compared against those three attempts.

/^[A-Z][AEIOUX][A-Z]{2}\d{2}(?:(?:0[13578]|1[02])(?:0[1-9]|[12]\d|3[01])|02(?:0[1-9]|[12]\d)|(?:0[469]|11)(?:0[1-9]|[12]\d|30))[HMX](?:AS|B[CS]|C[CHLMS]|D[FG]|G[RT]|HG|JC|M[CNS]|N[ELT]|OC|PL|Q[RT]|S[LPR]|T[CLS]|VZ|YN|ZS)[B-DF-HJ-NP-TV-Z]{3}[0-9A-Z]\d$/
passes 23/23 cases

Comparison of existing patterns

Implementation

const re = new RegExp("^[A-Z][AEIOUX][A-Z]{2}\\d{2}(?:(?:0[13578]|1[02])(?:0[1-9]|[12]\\d|3[01])|02(?:0[1-9]|[12]\\d)|(?:0[469]|11)(?:0[1-9]|[12]\\d|30))[HMX](?:AS|B[CS]|C[CHLMS]|D[FG]|G[RT]|HG|JC|M[CNS]|N[ELT]|OC|PL|Q[RT]|S[LPR]|T[CLS]|VZ|YN|ZS)[B-DF-HJ-NP-TV-Z]{3}[0-9A-Z]\\d$", "");
re.test(input);

Limits

  • Valide seulement la FORME : ne calcule pas la clé numérique (dernier caractère). « BOXW310820HNERXN08 » et « PEGL890909MJCRMS09 » ont la bonne forme mais une clé fausse, et passent ce motif ; seul un calcul dans le code les rejette. La clé ne distingue pas non plus un « O » d'un « 0 » en position 17.
  • Ne gère ni la règle du siècle (position 17 : chiffre jusqu'en 1999, lettre A à J ensuite, impossible à vérifier avec un YY seul), ni les années bissextiles (« 29 février 1989 » passe), ni les mots interdits (« BACA », « PUTA »…) que l'Instructivo remplace par un X.
  • Le sexe X, attribué depuis 2022, est accepté mais n'est pas dans le tableau officiel que j'ai consulté (H ou M seulement) : il est attesté par la presse et par un numéro dont la clé est valide. Retirez-le du motif si vous suivez strictement le texte de 2018.
  • Majuscules ASCII seulement : « pegl890909mjcrms08 » est rejeté, sans normalisation. Une CURP qui passe forme et clé n'est pas forcément attribuée : seul le RENAPO le confirme. N'utilisez pas de vraies CURP dans vos tests.

Related pages