Regex Brazilian CPF
A CPF has 11 digits, written '000.000.000-00', the last two being a modulo 11 check. A little-known trap: repeated-digit numbers (111.111.111-11, 999.999.999-99) pass the check computation, verified, yet are rejected by every serious library. None of the three real attempts handles it in the regex: one gist requires the dots and rejects '39053344705', another writes an unescaped '.' and accepts '390x533x447-05', and cpf-cnpj-validator only filters repeats afterwards. Here's a pattern excluding repeats and refusing mixed separators, compared against those attempts.
/^(?!(\d)\1{2}\.?\1{3}\.?\1{3}-?\1{2}$)(?:\d{3}\.\d{3}\.\d{3}-\d{2}|\d{11})$/passes 23/23 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| Gist igorcosta (2014) — points et tiret obligatoires : rejette « 39053344705 » ; accepte 000.000.000-00 et 111.111.111-11 | ^\d{3}\.\d{3}\.\d{3}\-\d{2}$ | 18 / 23 | safe |
| Gist alexbruno — points non échappés : n'importe quel séparateur passe (« 390x533x447-05 ») ; accepte aussi les numéros à chiffre répété | ^\d{3}.\d{3}.\d{3}-\d{2}$ | 17 / 23 | safe |
| cpf-cnpj-validator (npm) — bonne forme, avec ou sans ponctuation, mais accepte 111.111.111-11 : une liste noire séparée les rejette ensuite | ^(?:\d{3}\.\d{3}\.\d{3}-\d{2}|\d{11})$ | 20 / 23 | safe |
Implementation
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);Limits
- 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.