Regex CNPJ brésilien (alphanumérique)
Depuis juillet 2026, la Receita Federal attribue des CNPJ alphanumériques à toutes les nouvelles inscriptions : les 12 premiers caractères peuvent être des lettres majuscules ou des chiffres, seule la clé finale reste numérique. Les anciens numéros ne changent pas. Une regex à chiffres seuls comme « ^\d{2}\.\d{3}\.\d{3}\/\d{4}\-\d{2}$ » rejette donc désormais le CNPJ officiel d'exemple 12.ABC.345/01DE-35. Parmi les tentatives réelles, une seule est déjà alphanumérique, et celle de django-localflavor accepte n'importe quel séparateur. Voici un motif aux deux formes, comparé à ces tentatives.
/^(?!0{2}\.?0{3}\.?0{3}\/?0{4}-?0{2}$)(?:[A-Z0-9]{2}\.[A-Z0-9]{3}\.[A-Z0-9]{3}\/[A-Z0-9]{4}-[0-9]{2}|[A-Z0-9]{12}[0-9]{2})$/passe 20/20 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Gist igorcosta — chiffres seuls : rejette le CNPJ alphanumérique officiel 12.ABC.345/01DE-35 et la forme sans ponctuation ; accepte 00.000.000/0000-00 | ^\d{2}\.\d{3}\.\d{3}\/\d{4}\-\d{2}$ | 14 / 20 | sûr |
| django-localflavor — déjà alphanumérique, mais « .? » accepte n'importe quel caractère (« 16x727x230/0001-97 ») et le masque partiel « 16727230/0001-97 » | ^([A-Z0-9]{2}).?([A-Z0-9]{3}).?([A-Z0-9]{3})\/?([A-Z0-9]{4})-?(\d{2})$ | 17 / 20 | sûr |
| cpf-cnpj-validator (npm) — la meilleure du lot, alphanumérique avec ou sans ponctuation ; accepte 00.000.000/0000-00, qu'une liste noire rejette ensuite | ^(?:[\dA-Z]{2}\.[\dA-Z]{3}\.[\dA-Z]{3}\/[\dA-Z]{4}-\d{2}|[\dA-Z]{12}\d{2})$ | 19 / 20 | sûr |
Implémentation
const re = new RegExp("^(?!0{2}\\.?0{3}\\.?0{3}\\/?0{4}-?0{2}$)(?:[A-Z0-9]{2}\\.[A-Z0-9]{3}\\.[A-Z0-9]{3}\\/[A-Z0-9]{4}-[0-9]{2}|[A-Z0-9]{12}[0-9]{2})$", "");
re.test(input);Limites
- Valide seulement la FORME : ne calcule pas les deux chiffres de contrôle modulo 11. « 16.727.230/0001-98 » et « 12.ABC.345/01DE-36 » ont la bonne forme mais une clé fausse, et passent ce motif ; seul un calcul dans le code les rejette.
- Accepte les majuscules et les chiffres sur les 12 premiers caractères, y compris I, O, U et Q, que la Receita autorise : les minuscules sont refusées. Normalisez en majuscules avant validation. Le motif exclut le seul numéro nul, 00.000.000/0000-00, qui passe pourtant le calcul de la clé.
- Les dates (attribution alphanumérique à partir de juillet 2026, numéros existants inchangés) viennent de la page officielle de la Receita Federal : un système qui n'a pas migré vers cette forme rejettera les nouveaux CNPJ à tort.
- Un CNPJ qui passe forme et clé n'est pas forcément attribué à une entreprise active : seule la Receita Federal le confirme.