Rexact
Cheatsheet

Regex CURP mexicaine

Une CURP a 18 caractères : 4 lettres d'initiales, une date YYMMDD, le sexe, un code d'État parmi 33, 3 consonnes internes, un caractère d'homonymie et une clé numérique. Les tentatives réelles se contentent de classes de lettres : la regex de python-stdnum accepte un sexe « Q » et une voyelle à la place d'une consonne, celle de la bibliothèque npm validate-curp accepte le mois 13 et l'État « QQ », et celle de la bibliothèque SAT satcfdi, bonne sur les États, accepte le 30 février. Voici un motif qui borne les mois, les jours par mois et les 33 États, comparé à ces trois tentatives.

/^[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$/
passe 23/23 cas

Comparatif des patterns existants

Implémentation

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);

Limites

  • 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.

Pages liées