Regex Brazilian CNPJ (alphanumeric)
Since July 2026, the Receita Federal assigns alphanumeric CNPJs to all new registrations: the first 12 characters may be uppercase letters or digits, only the final check stays numeric. Existing numbers do not change. A digits-only regex such as '^\d{2}\.\d{3}\.\d{3}\/\d{4}\-\d{2}$' therefore now rejects the official sample CNPJ 12.ABC.345/01DE-35. Among real attempts, only one is already alphanumeric, and django-localflavor's accepts any separator. Here's a pattern covering both forms, compared against those attempts.
/^(?!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})$/passes 20/20 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
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);Limits
- 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.