Rexact
Cheatsheet

Regex CPF brésilien

Un CPF a 11 chiffres, écrits « 000.000.000-00 », dont les deux derniers sont une clé modulo 11. Piège peu connu : les numéros à chiffre répété (111.111.111-11, 999.999.999-99) passent le calcul de la clé, vérifié, mais sont rejetés par toutes les bibliothèques sérieuses. Les trois tentatives réelles ne s'en occupent pas : un gist exige les points et rejette « 39053344705 », un autre écrit « . » non échappé et accepte « 390x533x447-05 », et la bibliothèque cpf-cnpj-validator ne filtre les répétitions qu'après coup. Voici un motif qui exclut les répétitions et refuse les séparateurs mélangés, comparé à ces tentatives.

/^(?!(\d)\1{2}\.?\1{3}\.?\1{3}-?\1{2}$)(?:\d{3}\.\d{3}\.\d{3}-\d{2}|\d{11})$/
passe 23/23 cas

Comparatif des patterns existants

Implémentation

const re = new RegExp("^(?!(\\d)\\1{2}\\.?\\1{3}\\.?\\1{3}-?\\1{2}$)(?:\\d{3}\\.\\d{3}\\.\\d{3}-\\d{2}|\\d{11})$", "");
re.test(input);

Limites

  • Valide seulement la FORME : ne calcule pas les deux chiffres de contrôle modulo 11. « 231.002.999-00 » et « 390.533.447-06 » ont la bonne forme mais une clé fausse, et passent ce motif ; seul un calcul dans le code les rejette.
  • L'exclusion des numéros à chiffre répété (000.000.000-00 à 999.999.999-99) est une règle de fait de toutes les bibliothèques sérieuses, pas une règle publiée par la Receita Federal, qui ne publie pas non plus l'algorithme de la clé : il vient de Wikipédia et du code de python-stdnum.
  • Un CPF qui passe forme et clé n'est pas forcément attribué : seule la Receita Federal peut confirmer qu'il existe et à qui il appartient. N'utilisez jamais de vrais CPF dans vos tests.
  • Accepte la forme avec ponctuation complète ou sans aucune ponctuation, mais refuse les formes mixtes (« 390.53344705 ») : normalisez en 11 chiffres avant stockage.

Pages liées